PDA

View Full Version : [Assembly] lunghezza stringa


Gandalf_BD
23-11-2006, 10:55
Ciao a tutti :)
volevo solo una conferma da voi...
non esiste una direttiva per l'assemblatore che calcola la lunghezza di una stringa, vero?
bisogna farsi un ciclo all'interno del programma, no?

grazie :)

andbin
23-11-2006, 11:29
non esiste una direttiva per l'assemblatore che calcola la lunghezza di una stringa, vero?
bisogna farsi un ciclo all'interno del programma, no?Sì, devi fare un loop:
; INPUT DS:SI -> stringa

XOR CX, CX
JMP LOOP_LEN_2
LOOP_LEN:
INC CX
INC SI
LOOP_LEN_2:
CMP [BYTE SI],0
JNE LOOP_LEN

; OUTPUT CX = lunghezza

Gandalf_BD
23-11-2006, 11:33
CMP [BYTE SI],0

mmh... :wtf: non ho ben capito questa istruzione...
tu fai una compare tra l'indirizzo, in byte, della stringa e il valore zero... come mai? :mbe:

andbin
23-11-2006, 11:41
mmh... :wtf: non ho ben capito questa istruzione...
tu fai una compare tra l'indirizzo, in byte, della stringa e il valore zero... come mai? :mbe:No, il contenuto dell'indirizzo puntato da DS:SI viene confrontato con 0

Gandalf_BD
23-11-2006, 12:25
No, il contenuto dell'indirizzo puntato da DS:SI viene confrontato con 0
si, giusto... :stordita:
quindi, praticamente scorri SI carattere per carattere finchè non la finisci e quindi il suo contenuto sarà uguale a zero, giusto?
in questo modo, però, se manca il terminatore di stringa non funziona giusto? tu così assumi che la stringa termini con uno 0, no? :wtf:

grazie mille per la disponibilità :)

andbin
23-11-2006, 12:46
quindi, praticamente scorri SI carattere per carattere finchè non la finisci e quindi il suo contenuto sarà uguale a zero, giusto?
in questo modo, però, se manca il terminatore di stringa non funziona giusto? tu così assumi che la stringa termini con uno 0, no? :wtf:Una stringa come la intende ad esempio il linguaggio "C" è appunto, per definizione, una sequenza di caratteri terminata da un carattere nullo.

Poi ovvio che è il programmatore che deve sapere su cosa sta lavorando.

Tra l'altro il codice che ho scritto si può anche riscrivere così:
XOR CX, CX
LOOP_LEN:
CMP [BYTE SI],0
JE LOOP_END
INC CX
INC SI
JMP LOOP_LEN
LOOP_END:
È solo una questione di ottimizzazione dei salti. Sono un po' arruginito di Assembly e dovrei andarmi a rileggere un po' di documentazione ma ... credo che quest'ultimo codice sia meglio del primo.

71104
23-11-2006, 14:11
Sì, devi fare un loop: [...] esiste un metodo più semplice (ti do un suggerimento: è un utente di questo forum :D :D :D)

Gandalf_BD
23-11-2006, 14:17
esiste un metodo più semplice (ti do un suggerimento: è un utente di questo forum :D :D :D)

:wtf:

andbin
23-11-2006, 14:19
esiste un metodo più semplice (ti do un suggerimento: è un utente di questo forum :D :D :D)È inutile che fai gli indovinelli :rolleyes: ... l'istruzione è REPNE SCASB.
Ma bisogna comunque fare un po' di setup vari ... il valore di (E)CX lo devi mettere al massimo, AL a zero, devi settare il flag di direzione e alla fine fare un semplice calcolo per ottenere il reale numero di caratteri.

okay
23-11-2006, 14:50
Ciao a tutti :)
volevo solo una conferma da voi...
non esiste una direttiva per l'assemblatore che calcola la lunghezza di una stringa, vero?
bisogna farsi un ciclo all'interno del programma, no?

grazie :)

con il tasm io lavoravo così per esempio:

string1 DB "Ciao amico"
string2 DB "Ciao amico mio"
lung EQU $-string2

cld
mov cx,lung
mov si,OFFSET string1
mov di,OFFSET string2
repe cmps ;confronto
jnz sono_uguali ;se ZF=0 sono uguali, altrimenti...
dec di ;posiziono i puntatori sul carattere diverso
dec si
...
...
sono_uguali:

volendo calcolare solo la lunghezza
mettendo un "inc" contatore ma solo per una stringa facendo il loop posso determinarne la lunghezza trovando appunto la lunghezza in "contatore".


ciao

Gandalf_BD
23-11-2006, 18:30
grazie a tutti :cincin:

repne scasb
23-11-2006, 19:20
Altra versione:


; ES:DI = Puntatore alla stringa

cld
mov cx,0FFFFh
xor al,al
repne scasb
not cx
dec cx

; CX = Lunghezza stringa

71104
23-11-2006, 19:22
LOOOOL ti aspettavo!! :D :rotfl: