Loop sembra non decrementare ecx

di il
6 risposte

Loop sembra non decrementare ecx

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

6 Risposte

  • Re: Loop sembra non decrementare ecx

    La chiamata a printf sicuramente modifica ecx quindi è meglio recuperare il suo valore. Nella sequenza di recupero scrivi

    pop eax
    pop eax
    pop eax
    pop ecx
    pop eax
  • Re: Loop sembra non decrementare ecx

    Grazie per la rapida risposta! Ho provato a modificare il codice come consigliato, all'inizio non funzionava perchè avevo messo una scanf che probabilmente mi rimodificava il valore di ecx, ma adesso funziona! Grazie mille
  • Re: Loop sembra non decrementare ecx

    Prego ... di nulla.

    Ricorda sempre che il valore dei registri, tra una chiamata e l'altra, non è detto che venga preservato ...
  • Re: Loop sembra non decrementare ecx

    Grazie della dritta, e a proposito di ciò, volevo chiedere il consiglio in questi casi qual è?
    Creare variabili locali nello stack potrebbe essere una soluzione?
    Penso si sia capito che sono un novellino sull'assembly
  • Re: Loop sembra non decrementare ecx

    Di quali casi parli?
  • Re: Loop sembra non decrementare ecx

    Voglio dire nel mio caso le printf servivano solo ai fini di debug, ma questo mi creava problemi perchè le chiamate mi modificavano i valori dei registri. Ma al di là di questo volevo chiedere quando effettivamente vanno usate le variabili locali anzichè quelle globali che definisco nel segment .data?
Devi accedere o registrarti per scrivere nel forum
6 risposte