.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