Obligatorisk oppgave nr 3 i INF2270 v?ren 2015
Frist
Fristen er satt til: mandag 11. mai 2015 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 vilchar 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, %f, %s, %x og %%.
- Det er ingen breddeangivelse (som %12d) og heller
ingen modifikasjoner av %-spesifikasjonene (som +,
-, 0 eller l (for ?long?)).
- Signaturen er
int sprinter(unsigned char *res, unsigned char *format, ...);
Funksjonen kan alts? ha vilk?rlig mange parametre, men alltid minst to. - Hvis formatet inneholder ulovlige spesifikasjoner som %a eller %22d, 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.Koden skal skrives slik at den kan assembleres med kommandoen gcc -m32 p? Ifis Linux-maskiner.
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. De eneste unntaketene er at de er lov ? bruke funksjonene my_ftoa (se ~inf2270/programmer/Oblig-3/my_ftoa.c) for ? konvertere et flyt-tall til en tekststreng og add_int i samme fil.
Det finnes et testprogram ~inf2270/programmer/Oblig-3/test-sprinter.c 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.
- Oppgaven skal fungere for tegn som er kodet i ISO 8859-1
(ogs? kjent som Latin-1). V?r sikker p? at alle filene bruker
dette tegnsettet. Du kan sjekke tegnsettet med
$ file -i oblig3.html oblig3.html: text/html; charset=iso-8859-1
Hvis tegnsettet er noe annet enn ?ascii? eller ?iso-8859-1?, må man justere oppsettet i redigeringsprogrammet sitt eller fikse filen, for eksempel slik:
$ iconv -f UTF-8 -t LATIN1 min-utf-8-fil >min-latin1-fil
- 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
gradvis til ? kunne
h?ndtere %%, s? %c, %s, %f
og til sist %x og %d (som er vanskeligst).
- %f skriver ut et flyt-tall, n?rmere bestemt en
64-bits double. De tar alts? dobbelt s? stor plass
som int-verdier.
- Siden det eneste du skal gj?re med flyt-tallsverdiene er ?
overf?re dem som parameter til my_ftoa, trenger du ikke bruke
noen flyt-tallsoperasjoner (men du kan gjerne benytte deg av dem om
du foretrekker det).
- Let etter ideer i ukeoppgavene som har v?rt gitt og fasit til disse.
Lykke til!
4. april 2015
Dag Langmyhr