Hola amigos! Alguien me puede aclarar por que pasa esto ?
Tengo una rutina asi:
mov ecx, sizeof String1
lea esi, [String1]
lea edi, [String2]
cld
repe cmpsb
je Igual
jmp NoIgual
Esto seria un strcmp, bien.. eso funciona.. ahora si yo quiero meter eso dentro de una funcion, para luego llamarla pasandole string1 y string2 no funca.. digamos asi:
invoke strcmp, addr String1, addr String2
strcmp proto str1:DWORD, str2:DWORD
mov ecx, sizeof str1
lea esi, [str1]
lea edi, [str2]
cld
repe cmpsb
je Igual
jmp NoIgual
Igual:
mov eax, 0
jmp Exit
NoIgual:
mov eax, 1
Exit:
ret
strcmp endp
Bueno, eso es todo... ¿Por que no funca?
Prueba con esto:
push ebp
mov ebp,esp
...
...
código
...
...
leave
ret
Esto es para que la pila no sea la misma en las distintas funciones así no se pisan valores de otro "marco" por así decirlo. La instrucción leave se encarga de volver ebp y esp a como estaban.
Yo diría que da ese problema porque no sabe donde retornar en el ret (Porque no has cambiado el "marco" del stack)
Sa1uDoS
Gracias por responder Mr! Pero no funciono.. :/
No se que pasa... :¬¬
Y declarando la funcion con proc?
Probaste?
Jajaja sii,, ese de ahi es error de mi mano al escribir en el foro :p
Podria ser posible que sizeof no funcione dentro de la funcion ? ( En este caso )
No tengo para probar aca, pero podrias usar la lib de masm para sacar el len del string...
Si, lo pense.. pero no queria usar mas librerias.. :/
Al menos para probar si es eso me va a servir...
Por las dudas, un strlen:
strlen proc string:PSTR
push edx
xor eax,eax
mov edx, dword ptr[string]
_isNull:
cmp byte ptr[edx+eax],0
je _strlencmplte
inc eax
jmp _isNull
_strlencmplte:
pop edx
ret
strlen endp
Sacado de: http://www.enigmagroup.org/forums/asm/strlen(-char*-string-)-in-masm/ (http://www.enigmagroup.org/forums/asm/strlen(-char*-string-)-in-masm/)
Gracias MCKSys, pero no quiere andar.. no es el sizeof, funciona bien...
EDITADO:
Creo que me esta tomando la dirección de memoria, no el contenido.. pues si pongo la misma cadena a comparar si funciona.. pero.. por que ? y como debería aclarar que quiero el contenido y no la dirección de memoria ?
Cita de: Vaagish en 21 Mayo 2013, 01:51 AM
Creo que me esta tomando la dirección de memoria, no el contenido.. pues si pongo la misma cadena a comparar si funciona.. pero.. por que ? y como debería aclarar que quiero el contenido y no la dirección de memoria ?
Quitale los
[] a los LEA y prueba.
MASM deberia tomar los params directamente, sin tener que de-referenciar...
No funciono amigo.. luego pruebo otros metodos en casa.. :/
Si usas la lib de masm y llamas a szCmp, te genera el siguiente codigo:
MOV ECX,DWORD PTR SS:[ESP+4]
MOV EDX,DWORD PTR SS:[ESP+8]
PUSH EBX
PUSH ESI
MOV EAX,-1
MOV ESI,1
Bucle:
ADD EAX,ESI
MOVZX EBX,BYTE PTR DS:[EAX+ECX]
CMP BL,BYTE PTR DS:[EAX+EDX]
JNZ NoIgual
TEST EBX,EBX
JE Iguales
ADD EAX,ESI
MOVZX EBX,BYTE PTR DS:[EAX+ECX]
CMP BL,BYTE PTR DS:[EAX+EDX]
JNZ NoIgual
TEST EBX,EBX
JE Iguales
ADD EAX,ESI
MOVZX EBX,BYTE PTR DS:[EAX+ECX]
CMP BL,BYTE PTR DS:[EAX+EDX]
JNZ NoIgual
TEST EBX,EBX
JE Iguales
ADD EAX,ESI
MOVZX EBX,BYTE PTR DS:[EAX+ECX]
CMP BL,BYTE PTR DS:[EAX+EDX]
JNZ NoIgual
TEST EBX,EBX
JNZ Bucle
Iguales:
POP ESI
POP EBX
RETN 8
NoIgual:
XOR EAX,EAX
POP ESI
POP EBX
RETN 8
El largo, pero efectivo (la comparación es Case-Sentive).
La ayuda dice:
szCmp
szCmp proc str1:DWORD,str2:DWORD
Description
szCmp compares two zero terminated strings for difference.
Parameters
1. str1 The first string to compare
2. str2 The second string to compare
Return Value
If the two strings match, the return value is the length of the string. If there is no match, the return value is zero.
Comments
The procedure can be used on strings that may be of uneven length as the terminator will produce the mismatch even if the rest of the charactes match.
Pusiste el 0 al final de las cadenas? Prueba a sacarlas de la función y llamarlas con un JMP a ver que pasa, si funciona prueba con un CALL en vez de invoke.
Por favor postea el código entero para que podamos ayudarte mejor ;).
Mira ese post a ver si te ayuda...
http://indetectables.net/viewtopic.php?f=87&t=26945
Sa1uDoS
Hola amigos, gracias por el interes.. ahi va el code...
; Datos
Cadena1 db "Hola", 0
Cadena2 db "Hola", 0
Iguall db "Las cadenas son iguales", 0
NoIguall db "Las cadenas son distintas", 0
; Declaracion
StrCmp proto :DWORD, :DWORD
; Llamado
invoke StrCmp, addr Cadena1, addr Cadena2
; Funcion
StrCmp proc Str1:DWORD, Str2:DWORD
mov ecx, sizeof Str1
lea esi, [Str1]
lea edi, [Str2]
cld
repe cmpsb
je Igual
jmp NoIgual
Igual:
invoke MessageBox, 0, addr Iguall, addr Titulo, MB_OK
mov eax, 0
ret
NoIgual:
invoke MessageBox, 0, addr NoIguall, addr Titulo, MB_OK
mov eax, 1
ret
StrCmp endp
Bueno, es un resumen,, pero basicamente es asi.. no entiendo que pasa.. Ha si, ya se que el ret no sale de la funcion, pero si son iguales las cadenas tampoco pasa por la etiqueta " Igual: "
Mr.blood: de ese enlace salio la rutina, yo la quiero adaptar para una funcion.. pero no funciona valga la redundancia :xD
MCKSys: Si no lo logro hoy con esta funcion, paso a probar con ese code ;) Gracias!!
EDITADO: Bueno,, con una pequeña modificacion funciona mejor.. pero igual queda un problema por resolver.. el cuerpo de la funcion quedo asi:
mov ecx, sizeof Str1
mov esi, [Str1]
mov edi, [Str2]
cld
repe cmpsb
je Igual
jmp NoIgual
Esta comparando la direccion de memoria si, comprobado.. Pero por que ? Como deberia aclararle que quiero el contenido en esi y en edi ? :/
Bueno.. al final use lstrcmp, no me complico mas.. Pero ya que estamos en el hilo, podria alguien explicar como se usa szCmp ?
Yo agrege masm.inc y masm.lib, luego llame a la funcion.. pero no da error ni me funciono tampoco.. :-\
Ya lo habia puesto:
Cita de: MCKSys Argentina en 21 Mayo 2013, 05:37 AM
La ayuda dice:
szCmp
szCmp proc str1:DWORD,str2:DWORD
Description
szCmp compares two zero terminated strings for difference.
Parameters
1. str1 The first string to compare
2. str2 The second string to compare
Return Value
If the two strings match, the return value is the length of the string. If there is no match, the return value is zero.
Comments
The procedure can be used on strings that may be of uneven length as the terminator will produce the mismatch even if the rest of the charactes match.
Cabe destacar que el valor de retorno es en EAX.
Saludos!
Gracias MCKSys!! No algo había echo mal que no funcionaba :p ahora si ;)