Autor
|
Tema: [Micro-rutina] strlen - ANSI (Leído 8,262 veces)
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Me he visto en la necesidad de diseñar una rutina strlen() lo más pequeña posible... He acabado con esto... 15bytes:strlen: pop edx pop edi push -1 pop ecx xor eax, eax repne scasb not ecx mov eax, ecx 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
|
|
|
|
xv0
Desconectado
Mensajes: 1.031
|
Hola push -1 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
|
include 'win32ax.inc' .data Cadena db 'mDrinky',0 longitud dd ? .code start: push Cadena call StrLen mov [longitud],eax invoke GlobalAlloc,GPTR,1024 push eax invoke wsprintfA,eax,"%d",[longitud] pop eax invoke MessageBox,0,eax,0,MB_OK ret StrLen: ; 14 bytes pop edx pop ecx push -1 pop eax bucle: inc eax cmp byte[ecx+eax],0 jne bucle jmp edx .end start
14 Bytes 
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
mr.blood
Desconectado
Mensajes: 150
|
No se si ya se puede acortar mas... yo creo que no. 13 bytes 14 bytesinclude 'C:\FASM\include\win32ax.inc' .data Mensaje db "mrblood",0 .code start: push Mensaje call strlen ret strlen: pop ebx pop edi mov eax,edi buc: inc eax cmp byte [eax],0 jne buc sub eax,edi jmp ebx .end start
EDITO: Olvidadlo, no retorna correctamente. Lo mas corto son 14 bytes hasta el momento. P.D.: Drinky, quiero ese beso xDSa1uDoS
|
|
« Última modificación: 21 Enero 2013, 20:35 pm por mr.blood »
|
En línea
|
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Ninguna de vuestras aproximaciones parece funcionar con una cadena nula  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
Kernel coder
Moderador
 
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
|
La mia si funciona con una cadena nula 
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
No, una cadena vacia tiene un tamaño de 0 caracteres.
No la función que yo quiero 
La mia si funciona con una cadena nula  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
Kernel coder
Moderador
 
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
No la función que yo quiero  Entonces no es strlen () 
|
|
|
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
|
Optimizando el code de mDrinky para que dé 1 con un str de largo 0 (  ), queda de 13 bytes: strlena: pop edx pop ecx xor eax, eax bucle: inc eax cmp byte ptr [ecx+eax],0 jne bucle jmp edx
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
|
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,545
|
14 Enero 2011, 02:35 am
por Littlehorse
|
|
|
Duda con strlen [Solucionado]
Programación C/C++
|
Dark00
|
9
|
5,968
|
11 Noviembre 2012, 19:17 pm
por Dark00
|
|
|
[FASM]strlen en ASM
ASM
|
0xDani
|
7
|
6,042
|
28 Diciembre 2012, 14:30 pm
por avesudra
|
|
|
strlen() y .length()
Programación C/C++
|
erest0r
|
4
|
4,628
|
17 Septiembre 2013, 08:25 am
por erest0r
|
|
|
Duda con programa - funcion strlen?
Programación C/C++
|
welchu
|
9
|
4,877
|
18 Febrero 2014, 03:11 am
por NOB2014
|
|