Problema con Función..

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

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

Vaagish

No funciono amigo.. luego pruebo otros metodos en casa.. :/

MCKSys Argentina

Si usas la lib de masm y llamas a szCmp, te genera el siguiente codigo:

Código (asm) [Seleccionar]

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

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


mr.blood

#12
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

Vaagish

#13
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 ? :/

Vaagish

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..  :-\

MCKSys Argentina

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

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


Vaagish

Gracias MCKSys!! No algo había echo mal que no funcionaba :p ahora si ;)