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?
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.
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 ;D
No se si ya se puede acortar mas... yo creo que no.
13 bytes 14 bytes
include '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 xD
Sa1uDoS
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.
Cita de: Karcrack en 21 Enero 2013, 20:09 PMAdemá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.
La mia si funciona con una cadena nula :rolleyes:
Cita de: Eternal Idol 7D en 21 Enero 2013, 20:59 PM
No, una cadena vacia tiene un tamaño de 0 caracteres.
No la función que yo quiero :laugh:
Cita de: mDrinky en 21 Enero 2013, 21:04 PM
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 :)
Cita de: Karcrack en 21 Enero 2013, 23:56 PM
No la función que yo quiero :laugh:
Entonces no es strlen
() :silbar:
Optimizando el code de mDrinky para que dé 1 con un str de largo 0 ( :P), 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
Cita de: MCKSys Argentina 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:
strlena:
pop edx
pop ecx
xor eax, eax
bucle:
inc eax
cmp byte ptr [ecx+eax],0
jne bucle
jmp edx
si :) lo unico que si es una cadena no le suma ese byte nulo.
El asunto es que estoy parcheando un PE que tiene una función con este comportamiento (Cadena NULA = 1, etc...) Quería inyectar un poco de código sin necesidad de redireccionarme a/crear codecaves. Substituyendo la función por una de 20bytes tenía más que suficiente para lo que quería inyectar :)
Me encantan este tipo de threads :rolleyes: ;-)
A ver si acabo una función RC4 y vemos cuanto la podemos recortar >:D
La mia devuelve 1 si la cadena es núla, el código esta escrito en unix-like.
.section .data
cadena:
.ascii ""
.section .text
.globl _start
_start:
pushq $cadena
popq %rbx
C.0:
incb %bl
incb %dl
cmpb %al, (%rbx)
jne C.0
movl %edx, %edi
movb $0x1, %al
syscall
14 bytes C.0.
Kdump:
CALL exit(0x1)
Un saludo.
Hoy viendo esta (http://www.rinconsolidario.org/eps/asm8086/CAP6.html) pagina recorde este tema e hice una funcion de 10 bytes.
include 'C:\FASM\include\win32ax.inc'
.code
start:
push ebp
mov ebp, esp
push mensaje
call strlen
leave
ret
strlen:
pop edx
pop edi
xor ecx, ecx
bucle:
inc ecx
SCASB
jnz bucle
jmp edx
.end start
.data
mensaje db "Mr.BlooD",0
Sa1uDoS