[ASM] Funciones para manipular cadenas - by regx

Iniciado por ProcessKill, Febrero 24, 2010, 04:00:18 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Febrero 24, 2010, 04:00:18 PM Ultima modificación: Febrero 08, 2014, 05:30:42 PM por Expermicid
strlen(char*)
Código: asm

strlen:
     push ebp
     mov ebp,esp
     cld
     mov edi,[ebp + 8]
     mov al,0
     mov ecx,0xFFFFFFFF
     L1:
        inc ecx
        scasb
        jnz L1
     mov eax,ecx
     pop ebp
retn 4


strcpy(char* dest, char* source);

Código: asm

strcpy:
        push ebp
        mov ebp,esp
        push esi
        push edi
        cld
        mov esi,[ebp + 12]
        mov edi,[ebp + 8]
        @1:
                movsb
                cmp byte[esi],0
                jnz @1
        pop edi
        pop esi
        pop ebp
retn 8

strncpy(char* dest, char* source, int bytes_a_copiar)
Código: asm

strncpy:
     push ebp
     mov ebp,esp
     push esi
     push edi
     push ecx
     mov ecx,[ebp + 16]
     mov esi,[ebp + 12]
     mov edi,[ebp + 8]
     repnz movsb
     pop ecx
     pop edi
     pop esi
     pop ebp
retn 12


otra funcion chapucera mas..

strrev(char*)

Código: asm

strrev:
        push ebp
        mov ebp,esp
        push edi
        mov edi,[ebp + 8]
        push edi
        call strlen
        xor ecx,ecx
        dec eax
        jmp LL1
        LL0:
                dec eax
                inc ecx
                cmp ecx,eax
                jge LL2
        LL1:
                mov dl,byte[edi + ecx]
                xchg byte[edi + eax],dl
                mov byte[edi + ecx],dl
                jmp LL0

        LL2:
        pop edi
        pop ebp
retn 4


itoa(char* buff, int numero)
Código: asm

itoa:
      push ebp
      mov ebp,esp
      pushad
      mov edi,[ebp + 8]
      mov eax,[ebp + 12]
      mov ebx,10
      L@@1:
        xor edx,edx
        div ebx
        xchg eax,edx
        or eax,48
        stosb
        mov eax,edx
        cmp eax,0
        jnz L@@1
        inc edi
        mov byte[edi],al
        push dword[ebp + 8]
        call strrev
      popad
      pop ebp
retn 8


strcat(char* destino, char* source)

Código: asm

strcat:
push ebp
mov ebp,esp
push esi
push edi
mov esi,[ebp + 12]
mov edi,[ebp + 8]
mov al,0
repnz scasb
dec edi
@a:
movsb
cmp byte[esi],al
jnz @a
mov byte[esi],al
pop edi
pop esi
pop ebp
retn 8


toUpper(char*)
Código: asm

toUpper:
push ebp
mov ebp,esp
    mov esi,[ebp + 8]
begin:
    lodsb
    cmp al,0
    je endx
    sub al,0x61
    cmp al,0x1A
    ja incr
    and byte[esi-1],0xDF
    incr:
jmp begin
endx:
pop ebp

retn 4




toLower(char*)
Código: asm

toLower:
    push ebp
    mov ebp,esp
    mov esi,[ebp + 8]
beginL:
    lodsb
    cmp al,0
    je endxL
    sub al,0x41
    cmp al,0x1A
    ja incrL
    or byte[esi-1],0x20
    incrL:
jmp beginL
endxL:
pop ebp
retn 4