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

 

 


Tema destacado: Tutorial básico de Quickjs


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


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
[Micro-rutina] strlen - ANSI
« en: 21 Enero 2013, 02:59 am »

Me he visto en la necesidad de diseñar una rutina strlen() lo más pequeña posible... He acabado con esto...
15bytes:
Código
  1. strlen:
  2.    pop  edx
  3.    pop  edi
  4.    push -1
  5.    pop  ecx
  6.    xor  eax, eax
  7.    repne scasb
  8.    not  ecx
  9.    mov  eax, ecx
  10.    jmp  edx
(No cumple el Intel ABI, pero puedo asumir que EDI se modifique y así me ahorro 2bytes)

¿Alguien ve la forma de recortarlo más?


En línea

cpu2


Desconectado Desconectado

Mensajes: 994


Ver Perfil
Re: [Micro-rutina] strlen - ANSI
« Respuesta #1 en: 21 Enero 2013, 18:43 pm »

Hola

Código
  1. push -1  
  2. pop  ecx

El push son dos bytes, pop uno, si el valor de ecx fuera cero podrías hacer un not y serian dos bytes.

¿Puedes hacer eso?

Un saludo.


En línea

fary
Colaborador
***
Desconectado Desconectado

Mensajes: 958



Ver Perfil WWW
Re: [Micro-rutina] strlen - ANSI
« Respuesta #2 en: 21 Enero 2013, 19:19 pm »

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.     Cadena     db 'mDrinky',0
  5.     longitud   dd ?
  6. .code
  7. start:
  8.    push Cadena
  9.    call StrLen
  10.  
  11.    mov [longitud],eax
  12.    invoke GlobalAlloc,GPTR,1024
  13.    push eax
  14.    invoke wsprintfA,eax,"%d",[longitud]
  15.    pop eax
  16.    invoke MessageBox,0,eax,0,MB_OK
  17.  
  18.    ret
  19.  
  20.  
  21.    StrLen:  ; 14 bytes
  22.        pop edx
  23.        pop ecx
  24.        push -1
  25.        pop eax
  26.        bucle:
  27.        inc eax
  28.        cmp byte[ecx+eax],0
  29.        jne bucle
  30.        jmp edx
  31.  
  32. .end start
  33.  

14 Bytes
;D
En línea

Un byte a la izquierda.
mr.blood

Desconectado Desconectado

Mensajes: 150


Ver Perfil
Re: [Micro-rutina] strlen - ANSI
« Respuesta #3 en: 21 Enero 2013, 19:44 pm »

No se si ya se puede acortar mas... yo creo que no.

13 bytes 14 bytes

Código
  1. include 'C:\FASM\include\win32ax.inc'
  2. .data
  3. Mensaje db "mrblood",0
  4. .code
  5. start:
  6. push Mensaje
  7. call strlen
  8. ret
  9. strlen:
  10. pop ebx
  11. pop edi
  12. mov eax,edi
  13. buc:
  14. inc eax
  15. cmp byte [eax],0
  16. jne buc
  17. sub eax,edi
  18. jmp ebx
  19.  
  20. .end start

EDITO:

Olvidadlo, no retorna correctamente. Lo mas corto son 14 bytes hasta el momento.

P.D.: Drinky, quiero ese beso xD

Sa1uDoS
« Última modificación: 21 Enero 2013, 20:35 pm por mr.blood » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [Micro-rutina] strlen - ANSI
« Respuesta #4 en: 21 Enero 2013, 20:09 pm »

Ninguna de vuestras aproximaciones parece funcionar con una cadena nula ;) >:D

Además la función debe incluir el byte nulo en el tamaño. Por lo tanto, con una cadena nula debe devolver 1.
En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.852


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [Micro-rutina] strlen - ANSI
« Respuesta #5 en: 21 Enero 2013, 20:59 pm »

Además la función debe incluir el byte nulo en el tamaño. Por lo tanto, con una cadena nula debe devolver 1.

No, una cadena vacia tiene un tamaño de 0 caracteres.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
fary
Colaborador
***
Desconectado Desconectado

Mensajes: 958



Ver Perfil WWW
Re: [Micro-rutina] strlen - ANSI
« Respuesta #6 en: 21 Enero 2013, 21:04 pm »

La mia si funciona con una cadena nula  :rolleyes:
En línea

Un byte a la izquierda.
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [Micro-rutina] strlen - ANSI
« Respuesta #7 en: 21 Enero 2013, 23:56 pm »

No, una cadena vacia tiene un tamaño de 0 caracteres.
No la función que yo quiero :laugh:

La mia si funciona con una cadena nula  :rolleyes:
Devuelve 0 y quiero que sea 1 :-\ Fuera de esa necesidad tu código haría mejor el clone de strlen() y cumple el intel ABI :)
« Última modificación: 22 Enero 2013, 00:00 am por Karcrack » En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.852


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [Micro-rutina] strlen - ANSI
« Respuesta #8 en: 22 Enero 2013, 00:04 am »

No la función que yo quiero :laugh:

Entonces no es strlen()  :silbar:
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.016


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: [Micro-rutina] strlen - ANSI
« Respuesta #9 en: 22 Enero 2013, 02:22 am »

Optimizando el code de mDrinky para que dé 1 con un str de largo 0 ( :P), queda de 13 bytes:

Código
  1. strlena:
  2.    pop edx
  3.    pop ecx
  4.    xor eax, eax
  5. bucle:
  6.    inc eax
  7.    cmp byte ptr [ecx+eax],0
  8.    jne bucle
  9.    jmp edx
  10.  
En línea

MCKSys Argentina

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

Páginas: [1] 2 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 7,925 Último mensaje 14 Enero 2011, 02:35 am
por Littlehorse
Duda con strlen [Solucionado]
Programación C/C++
Dark00 9 4,051 Último mensaje 11 Noviembre 2012, 19:17 pm
por Dark00
[FASM]strlen en ASM
ASM
0xDani 7 4,133 Último mensaje 28 Diciembre 2012, 14:30 pm
por avesudra
strlen() y .length()
Programación C/C++
erest0r 4 3,295 Último mensaje 17 Septiembre 2013, 08:25 am
por erest0r
Duda con programa - funcion strlen?
Programación C/C++
welchu 9 3,109 Último mensaje 18 Febrero 2014, 03:11 am
por NOB2014
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines