Buonasera,
dovrei scorrere due stringhe e confrontarle carattere per carattere.
Per fare ciò ho utilizzato l'istruzione loop notando che ciclava all'infinito crashando.
Così ho inserito le printf per verificare il valore all'interno di ecx ad ogni iterazione.
Il primo printf conferma il corretto valore in ecx( ecx=72), mentre il secondo printf (prima che inizi il ciclo) mi fa comparire ECX=1975019696.
A questo punto l'istruzione loop pare non influire su ecx.
Perchè il valore di ecx viene modificato?
Grazie a chi mi risponderà
CPU X64
global myfunc ; esporto il simbolo
extern printf, scanf
section .data
lenT dd 0
lenA dd 0
dimT db "Dimensione di T: %d", 10, 0
dimA db "Dimensione di A: %d", 10, 0
str2 db "Confronto carattere %c di T con carattere %c di A; ECX = %d; lenA = %d", 10, 0
strecx db "lenA = %d; ECX = %d", 10, 0
num1 dd 123
strscanfint db '%d',0
trovato db "Trovato!!!", 10, 0
section .bss
currA resb 1
currT resb 1
section .text
myfunc:
push ebp
mov ebp, esp
mov esi, [ebp+12] ; esi contiene l'indirizzo di t, cioè punta al primo carattere di t
mov edi, [ebp+8] ; edi contiene l'indirizzo di a, cioè punta al primo carattere di a
; Calcolo la dimensione delle 2 stringhe
; Dimensione di t
mov ebx, 0
tlen:
cmp BYTE [esi+ebx], 0
jne continua_tlen
; altrimenti ho trovato la dimensione di t
mov [lenT], ebx
xor ebx, ebx
jmp alen
continua_tlen:
inc ebx
jmp tlen
; Dimensione di a
alen:
cmp BYTE [edi+ebx], 0
jne continua_alen
; altrimenti ho trovato la dimensione di a
mov [lenA], ebx
; Ciclo per trovare i caratteri in A
xor ebx, ebx ; ebx = 0
next_t:
mov al, [esi+ebx]
mov ecx, [lenA]
push ecx
push DWORD [lenA]
push strecx
call printf
pop eax
pop eax
pop eax
lp1:
;
mov edx, [edi]
mov [currA], edx
mov edx, [esi+ebx]
mov [currT], edx
push DWORD [lenA]
push ecx
push DWORD [currA]
push DWORD [currT]
push str2
call printf
pop eax
pop eax
pop eax
pop eax
pop eax
;
scasb
je found
continua_lp1:
loop lp1
; Ho finito di scorrere la stringa
inc ebx
cmp ebx, lenT ; se ebx != lenT
jne next_t ; salto al prossimo carattere
mov edi, [ebp+8] ; edi nel frattempo è stato incrementato dagli scasb quindi devo ripristinarlo!
xor eax, eax ; metto 0 in eax
mov ecx, [lenA]
pop ebp
ret
found:
push trovato
call printf
pop eax
mov BYTE [edi-1], 0
jmp continua_lp1
continua_alen:
inc ebx
jmp alen