.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