Problema con Función..

Iniciado por Vaagish, 20 Mayo 2013, 23:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Vaagish

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?

mr.blood

Prueba con esto:

Código (asm) [Seleccionar]

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

Vaagish

Gracias por responder Mr! Pero no funciono.. :/

No se que pasa...  :¬¬

MCKSys Argentina

Y declarando la funcion con proc?

Probaste?
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vaagish

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 )

MCKSys Argentina

No tengo para probar aca, pero podrias usar la lib de masm para sacar el len del string...
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vaagish

Si, lo pense.. pero no queria usar mas librerias.. :/

Al menos para probar si es eso me va a servir...

MCKSys Argentina

Por las dudas, un strlen:

Código (asm) [Seleccionar]

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/
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vaagish

#8
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 ?

MCKSys Argentina

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...
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."