Obligatorisk oppgave nr 2 i INF2270 våren 2012
Frist
Fristen er satt til: mandag 23. april 2012 kl 12.00. Oppgaven skal leveres via Devilry.
Funksjonen sprintf
Standardfunksjonen sprintf i C fungerer som printf men resultatet havner i en tekstvariabel i stedet for å bli skrevet ut. For eksempel vil
char str[200]; int x; x = 4; sprintf(str, "Her er %d %s.", x, "siffer");
resultere i at 'str' inneholder «Her er 4 siffer.» (samt en 0-byte som avslutning). Les mer i man sprintf om hvorledes sprintf fungerer; ikke glem at sprintf også returnerer en verdi.
Oppgaven er å skrive funksjonen sprinter som er en forenklet utgave av sprintf. Nærmere bestemt kan vi anta følgende forenklinger:
- De eneste %-spesifikasjonene som kan forekomme, er %c, %d, %s, %x og %%. Alle disse (unntatt %%) kan ha en ikkenegativ breddeangivelse som angir minimum antall tegn som skal benyttes for verdien, for eksempel %12s.
- Det er ingen andre modifikasjoner av %-spesifikasjonene (som +, -, 0 eller l (for «long»)).
- Signaturen er
int sprinter(char *res, char *format, ...);
- Hvis formatet inneholder ulovlige spesifikasjoner som %a eller %-22x, kan du selv velge hva resultatet skal være, men funksjonen skal ikke gi kjørefeil.
Oppgaven
Oppgaven er å skrive funksjonen sprinter i x86-assemblerspråk. Den skal løses individuelt, så vi forventer at alle innleverte løsninger er forskjellige. Det er heller ikke lov å bruke en kompilator til å generere koden. Ytterligere regler finnes i /studier/admin/obligatoriske-aktiviteter/mn-ifi-oblig.html som forutsettes lest av alle som skal levere obligatoriske oppgaver i INF2270.
Legg vekt på oversiktlig programmering og gode kommentarer! Gruppelæreren kan nekte å rette besvarelsen hvis det er for vanskelig å forstå hvorledes funksjonen virker.
Det er lov å la sprinter kalle andre funksjoner, men da skal de også skrives i x86-assemblerspråk og legges ved.
Det finnes et testprogram som gruppelærerne vil bruke under rettingen; det kan være lurt å prøve det selv.
Er du i tvil om noe i oppgaven, så spør gruppelæreren eller meg.
Hint
- Skriv aller først noen C-programmer som bruker den originale sprintf slik at du blir sikker på hvorledes sprintf virker.
- Før du begynner å skrive assemblerkode, bør du løse problemet i et høynivåspråk du kjenner godt (for eksempel C) slik at du vet nøyaktig hva som skal gjøres.
- De færreste klarer å skrive en slik funksjon i ett uten testing. Start heller med en implementasjon av strcpy og utvid den til å håndtere %%, så %c, %s og %x og til sist %d (som er vanskeligst).
- Helt til sist kan du legge inn håndteringen av breddeangivelsen. En god idé (men intet krav) er å legge resultatet produsert i forrige punkt i en egen buffer og så skrive kode som finner ut hvor mange blanke som må settes inn før bufferen overføres.
Vi antar at ingen tekster som skal skrives ut (med %s) er lengre enn 1023 tegn.
- Let etter ideer i ukeoppgavene som har vært gitt og fasit til disse.
Lykke til!
10. februar 2012
Dag Langmyhr