Título: [FASM]strlen en ASM Publicado por: 0xDani en 26 Diciembre 2012, 20:30 pm He encontrado una implementacion de strlen en ASM, podriais ayudarme a entenderla?
Código
Enlace: http://www.betamaster.us/blog/?p=471 Saludos. Título: Re: [FASM]strlen en ASM Publicado por: _Enko 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. Título: Re: [FASM]strlen en ASM Publicado por: 0xDani 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:
Título: Re: [FASM]strlen en ASM Publicado por: avesudra 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 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): 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.-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 Título: Re: [FASM]strlen en ASM Publicado por: 0xDani 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
Asi EDI contiene el primer byte de la cadena, no su direccion no? A mi pobre entender deberia ser: Código
Saludos y gracias por la ayuda! Título: Re: [FASM]strlen en ASM Publicado por: avesudra en 28 Diciembre 2012, 13:53 pm Porque será un puntero y strInput lo que contiene es otra dirección :silbar:
Título: Re: [FASM]strlen en ASM Publicado por: 0xDani 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. Título: Re: [FASM]strlen en ASM Publicado por: avesudra 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 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 |