[Micro-rutina] strlen - ANSI

Iniciado por Karcrack, 21 Enero 2013, 02:59 AM

0 Miembros y 3 Visitantes están viendo este tema.

Karcrack

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 (asm) [Seleccionar]
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?

cpu2

Hola

Código (asm) [Seleccionar]
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.

fary

Código (asm) [Seleccionar]
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
Un byte a la izquierda.

mr.blood

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

13 bytes 14 bytes

Código (asm) [Seleccionar]
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

Karcrack

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.

Eternal Idol

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 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  :rolleyes:
Un byte a la izquierda.

Karcrack

#7
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 :)

Eternal Idol

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 ( :P), queda de 13 bytes:

Código (asm) [Seleccionar]

strlena:
    pop edx
    pop ecx
    xor eax, eax
bucle:
    inc eax
    cmp byte ptr [ecx+eax],0
    jne bucle
    jmp edx
MCKSys Argentina

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