All pastes #993207 Raw Edit

Miscellany

public text v1 · immutable
#993207 ·published 2008-04-22 13:46 UTC
rendered paste body
    .globl  sprinter

# Name:         sprinter
# Synopsis:     sprintf-klone med noen begrensninger
# C-signatur:   int sprinter(char *res, char *format, ...)
# Registre:     CX - Resultat
#               AX - strlen
#               DX - Parameter-teller

sprinter:
    pushl   %ebp                    # Standard funksjonsstart
    movl    %esp,%ebp

    movl    $0,%eax                 # Setter returverdi til 0
    movl    $0,%edx                 # Setter parameterteller til 0

    movl    8(%ebp),%edi            # Flytter parametrene til
    movl    12(%ebp),%esi           # arbeidsregister

# Looper gjennom formatstrengen og finner kontrolltegn
loop:
    movb    (%esi),%cl              # Hent første tegn fra *format
    cmpb    $0,%cl                  # Sjekk om vi er på siste tegn
    je      exit

    cmpb    $0x25,%cl               # Se etter %-tegn
    je      control

    movb    %cl,(%edi)              # Flytt tegn til *res

    incl    %esi                    # Øk adressene
    incl    %edi
    incl    %eax                    # Øk teller

    jmp     loop

# Sjekker neste tegn etter % og foretar operasjoner deretter
control:
    incl    %esi
    movb    (%esi),%cl

    cmpb    $0x25,%cl               # Sjekk om vi skal sette inn %
    je      percent

    incl    %edx                    # Øk parameterteller
    cmpb    $0,16(%ebp,%edx,4)      # Sjekk at det er flere parametre
    je      error                   # Hvis ikke, returner med -1

    cmpb    $0x63,%cl               # Sjekk om vi skal sette inn en char-verdi
    je      char

    jmp     loop

# Setter inn % 
percent:
    movb    %cl,(%edi)              # Flytt % til *res
    incl    %esi
    incl    %edi
    incl    %eax

    jmp loop

# Setter inn en char ved %c
char:
    pushl   %ebx                    # Ta vare på innholdet i BX
    call dumpreg
    movl    16(%ebp,%edx,4),%ebx    # Flytt riktig parameter der %c skal være
    movl    %ebx,(%edi)
    call dumpreg
    popl    %ebx                    # Returner innhold til BX

    incl    %esi
    incl    %edi
    incl    %eax

    jmp     loop

# Dersom en feil oppstod, sørg for at vi returnerer -1
error:
    movl    $-1,%eax

exit:
    popl    %ebp
    movl    $0,(%edi)       # Avslutt: strengen med \0
    ret