elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  [FASM]strlen en ASM
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [FASM]strlen en ASM  (Leído 5,919 veces)
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
[FASM]strlen en ASM
« en: 26 Diciembre 2012, 20:30 pm »

He encontrado una implementacion de strlen en ASM, podriais ayudarme a entenderla?

Código
  1. ; Will return the length of a null-terminated string
  2. ; The result will be written to ECX
  3. ;
  4. ; Usage:
  5. ; hello_tmp db "test",0
  6. ; ...
  7. ; ccall   strlen, hello_tmp
  8. proc  strlen, strInput
  9. mov ecx,-1
  10. mov al,0
  11. mov edi,[strInput]
  12. cld
  13. repne scasb
  14. not ecx
  15. dec ecx
  16. ret
  17. endp

Enlace: http://www.betamaster.us/blog/?p=471

Saludos.


En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: [FASM]strlen en ASM
« Respuesta #1 en: 26 Diciembre 2012, 23:59 pm »

fijate que hacen las instrucciones "cld", "repne" y  "scasb" y con eso debe quedar claro.
Me atrevería a decir que está mucho mejor la implementecion de la c runtime de microsoft en mvcrt.dll _strelen. (son mas lineas de codigo, pero funciona mas rapido)
Ya que si mal no recuerdo,  no lo hacia de a byte a byte sino de dwrod.


En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: [FASM]strlen en ASM
« Respuesta #2 en: 27 Diciembre 2012, 13:50 pm »

La instruccion cld limpia la flag de direccion pero el repne con el scasb que hacen? No lo pillo  :huh:
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: [FASM]strlen en ASM
« Respuesta #3 en: 27 Diciembre 2012, 17:56 pm »

Hola 0xDani, REPNE repite un bucle y decrementa ECX mientras que la bandera zero no esté activada. SCASB  lo que hace es mirar si el byte de AL coincide con el byte que apunta EDI. Básicamente la instrucción SCASB sería similar a esto:
Código
  1. CMP AL,[EDI]
  2. INC EDI
Siguiendo con el problema que planteas el código es fácil de entender, el ciclo de REPNE termina cuando SCASB encuentra el final de la cadena. Lo más complicado de entender viene después. Que se le hace un NOT a ECX y lo disminuye en 1.
Esto tiene una explicación y es que para pasar un número de positivo a negativo, se realiza el complemento a dos. Que consiste en:
-Aplicar el NOT
-Sumar 1 al resultado obtenido.
Código:
Ejemplo(negativo a positivo):
-1 en binario es 1111
NOT 1111 = 0000
0000 + 1  = 0001
Ejemplo(positivo a negativo):
1 en binario es 0001
NOT 0001 = 1110
1110 + 1  = 1111
Una vez dicho esto, para pasar de un numero positivo a negativo sería exactamente igual. Pero en el caso de esta rutina, REPNE disminuye ECX también cuando encuentra el final de cadena, y además ECX ya tenía un -1 , así que el resultado si le aplicásemos el complemento a dos directamente estaría 2 por encima del correcto. Para corregir esto , una vez aplicado el NOT , en vez de sumarle un 1 , se le resta , provocando así que de el resultado correcto.

En línea

Regístrate en
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: [FASM]strlen en ASM
« Respuesta #4 en: 28 Diciembre 2012, 13:04 pm »

Gracias por la explicacion avesudra, pero todavia hay una cosa que no entiendo. Si SCASB compara AL con el byte al que apunta EDI, porque al principio hace:
Código
  1. mov edi,[strInput]

Asi EDI contiene el primer byte de la cadena, no su direccion no? A mi pobre entender deberia ser:
Código
  1. mov edi,strInput

Saludos y gracias por la ayuda!
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: [FASM]strlen en ASM
« Respuesta #5 en: 28 Diciembre 2012, 13:53 pm »

Porque será un puntero  y strInput lo que contiene es otra dirección  :silbar:
En línea

Regístrate en
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: [FASM]strlen en ASM
« Respuesta #6 en: 28 Diciembre 2012, 14:23 pm »

Que raro hubiera sido mas facil hacerlo como yo he dicho no?  ¬¬'

Pero bueno ya lo he comprendido gracias a los dos  ;-)

Saludos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: [FASM]strlen en ASM
« Respuesta #7 en: 28 Diciembre 2012, 14:30 pm »

Jajajaja hombre más fácil es pero lo que obtendrías en edi haciendo esto:
Código
  1. mov edi,strInput
Sería la dirección de memoria de la variable strInput(que es un puntero), no la de la dirección a la que apunta ese puntero, que es su contenido. Es un poco lioso :xD .Lo que puedes hacer para entenderlo mejor es compilar algún programilla y depurarlo con OllyDBG
« Última modificación: 28 Diciembre 2012, 14:33 pm por avesudra » En línea

Regístrate en
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[ANSI C] Split(), strlen(), mid(), Instr(), strcpy(). « 1 2 »
Programación C/C++
BlackZeroX 11 10,254 Último mensaje 14 Enero 2011, 02:35 am
por Littlehorse
Duda con strlen [Solucionado]
Programación C/C++
Dark00 9 5,755 Último mensaje 11 Noviembre 2012, 19:17 pm
por Dark00
[Micro-rutina] strlen - ANSI « 1 2 »
ASM
Karcrack 13 8,040 Último mensaje 4 Abril 2013, 02:14 am
por mr.blood
strlen() y .length()
Programación C/C++
erest0r 4 4,504 Último mensaje 17 Septiembre 2013, 08:25 am
por erest0r
Duda con programa - funcion strlen?
Programación C/C++
welchu 9 4,729 Último mensaje 18 Febrero 2014, 03:11 am
por NOB2014
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines