ps1c0s1s escribió:Marty dijo : codigo correcto
Código: Seleccionar todo
.code
comparar:
mov ecx,sizeof cadena1 ; tamano del string , ecx es un contador
mov ESI,offset cadena1 ; o LEA ESI,[cadena1]
mov EDI,offset cadena2 ; o LEA EDI,[cadena2]
loop1: ; lazo
push edi
mov dl,byte ptr edi
CMP byte ptr ESI,dl
JNE noiguales
inc esi
pop edi
inc edi
LOOPE loop1 ; if ( ecx !=0 ){ ecx = ecx -1; jmp loop1;}
JE iguales
.end comparar
Es bueno el codigo marty pero ... ninguna instrucción entre PUSH y POP modifica EDI, entonces no los necesita en este caso no es necesario el push/pop edi
el push y pop si tienen funcion
si te das cuenta del mov dl,byte ptr edi
por ejemplo si tienes un codigo correcto como
.data
[offset=401000] cadena byte "psycosis"
mov edi,offset cadena ; esi=401000
loop1:
push edi ; stack=401000 , edi =401000
mov dl,byte ptr edi ; dl = 70 , edi=401070 <<la cadena se cambia
pop edi; edi =401000
inc edi ; edi =401001 <<conserva la cadena
loope loop1
codigo malo :
mov edi,offset cadena ; esi=401000
loop1:
mov dl,byte ptr edi ; dl = 70 , edi=401070
inc edi ; edi =401071 << esto es el error , el edi tiene el byte 70 que es el quaraqter "p" y estas aumentado el countador de la cadena , el edi correcto es 401001 "sycosis"
loope loop1
nota = el JE es JZ y JNE es JNZ , son lo mismo
espero que estoy entendido
saludos