--*- coding: utf-8; -*-- INF2270 Oppgaver uke 7 (11.-15.2.2013) (Om det ikke er tid til å løse alle oppgavene, er 2, 3 og 6 viktigst, deretter oppgave 5.) Oppgave 1 Skriv i x86-assemblerspråk funksjonen int sum3 (int a, int b, int c) som summerer tre heltall. Skriv også et testprogram i C som sjekker om funksjoner virker. Oppgave 2 Skriv i assemblerspråk funksjonen int f (int a, int b, int c) som beregner funksjonen f(a,b,c) = a+3b+c. NB! Oppgaven skal løses _kun_ med de instruksjonene dere har lært hittil: movl, addl, subl, incl, decl og ret. Oppgave 3 Skriv i assemblerspråk funksjonen int intcmp (int a, int b) som sammenligner to heltall og returnerer et negativ tall om ab. NB! Oppgaven skal løses _kun_ med de instruksjonene dere har lært hittil: movl, addl, subl, incl, decl og ret. Oppgave 4 Standardfunksjonen i C char *strdup (char *s) lager en kopi (med 'malloc') av teksten 's' og returnerer en peker til den. Skriv funksjonen 'strdup' i C. Hint. Det kan være lurt å kalle den 'my_strdup' for å unngå forvirring med standardfunksjonen. Oppgave 5 Funksjonen char *my_itoa (int v) gjør det motsatte av 'atoi' som var oppgave for et par uker siden: den lager en tekst som inneholder sifrene i tallet 'v' og returnerer en peker til denne. Skriv denne funksjonen i C og uten å bruke 'sprintf'. Bruk 'strdup' (se oppgave 4) til å lage en kopi av teksten. Eksempler my_itoa(212) = "212" my_itoa(-13) = "-13" my_itoa(1231) = "1231" my_itoa(0) = "0" Hint. Ved å dele på 10 flere ganger, finner man sifrene i tallet; disse kan så konverteres til tekst og settes sammen. 1231 % 10 = 1 1 + '0' = '1' 1231 / 10 = 123 123 % 10 = 3 3 + '0' = '3' 123 / 10 = 12 12 % 10 = 2 2 + '0' = '2' 12 / 10 = 1 1 % 10 = 1 1 + '0' = '1' 1 / 10 = 0 Men sifrene kommer i motsatt rekkefølge av det vi ønsker. Hvordan kan vi snu dem? Oppgave 6 Følgende program #include int main (void) { short a, b, sum; a = 20000; b = 20000; sum = a+b; printf("%d + %d = %d\n", a, b, sum); } gir dette resultatet når det kjøres: 20000 + 20000 = -25536 Dette er galt. Forklar hvorfor feilen oppstår. Oppgave 7 (ukens nøtt) I ukeblad kan man ofte finne følgende tabell: | A | B | C | D | E | | | | | | | | 16 | 8 | 4 | 2 | 1 | | 17 | 9 | 5 | 3 | 3 | | 18 | 10 | 6 | 6 | 5 | | 19 | 11 | 7 | 7 | 7 | | 20 | 12 | 12 | 10 | 9 | | 21 | 13 | 13 | 11 | 11 | | 22 | 14 | 14 | 14 | 13 | | 23 | 15 | 15 | 15 | 15 | | 24 | 24 | 20 | 18 | 17 | | 25 | 25 | 21 | 19 | 19 | | 26 | 26 | 22 | 22 | 21 | | 27 | 27 | 23 | 25 | 23 | | 28 | 28 | 28 | 26 | 25 | | 29 | 29 | 29 | 27 | 27 | | 30 | 30 | 30 | 30 | 29 | | 31 | 31 | 31 | 31 | 31 | Med denne kan man imponere sine venner. Be dem velge et tilfeldig tall mellom 1 og 31 og kun fortelle deg i hvilke kolonner det står. (For eksempel står 19 i kolonne A, D og E, så det eneste du får vite er «A, D og E».) Da kan du på et øyeblikk fortelle dem at de tenkte på 19 ved å summere de øverste tallene i de angitte kolonnene. (A+D+E = 16+2+1 = 19.) Ofte er tallene i hver kolonne blandet tilfeldig (med unntak av det øverste tallet) for at det skal se enda vanskeligere ut. Hva er hemmeligheten med tabellen? Hvordan er den blitt til? Hint. Dette har noe med binærtall å gjøre. Tilleggsspørsmål: Ett tall i tabellen er galt; hvilket?