copy string to another

συζητήσεις για assembly

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
asmcoder
Δημοσιεύσεις: 3
Εγγραφή: 03 Φεβ 2008 13:25

copy string to another

Δημοσίευση από asmcoder » 03 Φεβ 2008 13:46

Kalhmera
Eimai neos sthn assembly thelw na antigracw ena string se ena allo (exw ton fasm)
pws ua to kanw?

Κώδικας: Επιλογή όλων

source db 'This is a string'
dest db 50 dup (?)

Άβαταρ μέλους
Kainourios
Ruby Moderator
Δημοσιεύσεις: 504
Εγγραφή: 18 Μάιος 2005 16:20
Τοποθεσία: Κορυδαλλός
Επικοινωνία:

copy string to another

Δημοσίευση από Kainourios » 03 Φεβ 2008 14:48

Δε ξέρω αν είναι ο καλύτερος τρόπος αλλά ένα γρήγορα είναι αυτό:

Κώδικας: Επιλογή όλων

             .model small 
            .stack
            .data
            source db 'This is a string',0 
            dest db 50 dup (?) 
            .code
            mov ax,@data
            mov ds,ax
            mov bx,0 
      loop: mov al,source[bx] 
            cmp al,0
            jz telos
            mov dest[bx],al
            inc bx
            jmp loop
            
            telos:
            .exit 0
            end
Εξήγηση:
source db 'This is a string',0: Το έκανα null terminated, θα τσεκάρω πότε τελείωσε ελέγχοντας με το null. Θα δεις παρακάτω γιατί.
mov bx,0: Θα χρησιμοποιήσω τον bx για να βρίσκω το offset του κάθε γράμματος του string
loop: mov al,source[bx]: Φορτώνω ένα γράμμα στον al κάθε φορά (π.χ. το source[0] που θα φορτωθεί στην αρχή είναι το γράμμα Τ δηλαδή το ascii 54 θα έχει ο al).
cmp al,0:Συγκρίνει τον al με το 0. Εδώ χρησιμοποιώ το null terminated, αν πάρει το 0 ο al σημαίνει είναι το τελευταίο στοιχείο του string.
jz telos:Αν η παραπάνω σύγκριση άφησε μηδέν, τότε το τελευταίο στοιχείο ήταν το 0 άρα κάνε jump στο label telos, αλλιώς συνέχισε στην από κάτω εντολή.
mov dest[bx],al:Αν φτάσει εδώ, σημαίνει ότι δεν ισχύει η παραπάνω εντολή οπότε μεταφέρει το περιεχόμενο του al στο dest[bx].
inc bx:Αύξηση του bx για να πάρει το επόμενο γράμμα
jmp loop:Άλμα στο label loop για να γίνει η ίδια διαδικασία (να πάρει ένα στοιχείο του string, να τσεκάρει αν είναι το 0 δηλαδή το τελευταίο, αν είναι 0 να κάνει άλμα στο label telos, αλλιώς βάζει το στοιχείο στο dest και συνεχίζει ξανά).
telos:
.exit 0
end

Η υλοποίηση ίσως δεν είναι η καλύτερη δυνατή, αλλά κάνει αυτό που ζήτησες :).
Επίσης με fasm δεν έχω ασχοληθεί πολύ, το έγραψα στον emu8086...

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

copy string to another

Δημοσίευση από LightForce » 03 Φεβ 2008 23:09

Να ένας απλός τρόπος για τον Fasm, θα αντιγράψει ένα null terminated string.

Κώδικας: Επιλογή όλων

     ;..
     mov si,source
     mov di,dest
     call copys
     ;..


; copy string
; in: si=source string, di=dest string

copys:                                                 
     push ax si di                                   
.cp:                                          
     lodsb
     test al,al
     jz .ex
     stosb
     jmp .cp
.ex:
     mov byte [di],0
     pop di si ax
     ret  


     source db 'This is a string',0 ;<--Null terminated
     dest db 50 dup &#40;?&#41; 

asmcoder
Δημοσιεύσεις: 3
Εγγραφή: 03 Φεβ 2008 13:25

copy string to another

Δημοσίευση από asmcoder » 08 Φεβ 2008 22:05

paidia sas eyxaristw arghsa na apanthsw ligo alla den exw internet spiti gia thn wra
lightforce allaja ton kwdika soy protimo to $ gia thn wra ayto jerw :)

Κώδικας: Επιλογή όλων

copys&#58;                                                 
     push ax si di                                   
.cp&#58;                                         
     lodsb
     cmp al,'$'
     jz .ex
     stosb
     jmp .cp
.ex&#58;
     mov byte &#91;di&#93;,'$'
     pop di si ax
     ret 

     source db 'This is a string','$'
     dest db 50 dup &#40;?&#41; 

egraca ena programa poy metraei to mhkos enos string ston metrhth cx pws sas fainetai ?

Κώδικας: Επιλογή όλων

org 100h

mov  si,source
mov  cx,0000h
start&#58;
mov al, byte&#91;si&#93;
cmp  al,'$'
je exit
inc  cx
inc  si
jmp  start

exit&#58;

;print string
mov  ah,09h
mov  dx,source
int  21h

;print cx decimal


mov  ax,4c00h
int  21h

source db 'To mhkos einai $'

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

copy string to another

Δημοσίευση από LightForce » 08 Φεβ 2008 22:25

Γειά χαρά,
Στην πρώτη περίπτωση δεν είναι λάθος ο τρόπος σου αφού θέλεις να χρησιμοποιήσεις $
Θα μπορούσες και να βελτιώσεις την ρουτίνα ώστε να αντιγράφει όχι μόνο ολόκληρο αλλά και μέρος ενός string.
Γενικά έχε υπόψη σου ότι είναι μια πολύ απλή ρουτίνα.
Eπίσης είναι καλύτερα να δουλεύεις με null terminated strings, θα τα συναντάς συχνά.

Για το μήκος του string, ο κώδικας σου δουλεύει, καλύτερα όμως να καλείς μια υπορουτίνα.
Να ένα παράδειγμα, είσοδος di=null terminated string, έξοδος cx=length

Κώδικας: Επιλογή όλων

strlen&#58;                                 
     push ax di
     xor al,al
     mov cx,0ffffh
     cld
     repnz scasb
     not cx
     dec cx
     pop di ax
     ret
asmcoder στο forum του Flat Assembler θα βρείς πολύ κώδικα και βοήθεια.

asmcoder
Δημοσιεύσεις: 3
Εγγραφή: 03 Φεβ 2008 13:25

copy string to another

Δημοσίευση από asmcoder » 08 Φεβ 2008 22:42

eyxaristw ga ton kwdika !!!
exei ontos poly kwdika alla gia thn einai akatalavistika gia mena file moy

Απάντηση

Επιστροφή στο “Assembly”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης