--*- coding: utf-8; -*-- INF2270 Løsningsforslag oppgaver uke 8 2014 Oppgave 1 Funksjonen: .globl sum3 sum3: movl 4(%esp),%eax addl 8(%esp),%eax addl 12(%esp),%eax ret Testprogrammet: #include extern int sum3 (int a, int b, int c); int tab[] = {1, 17, -3}; int main (void) { int tab_length = sizeof(tab)/sizeof(int); int i1, i2, i3; for (i1 = 0; i1 < tab_length; ++i1) { for (i2 = 0; i2 < tab_length; ++i2) { for (i3 = 0; i3 < tab_length; ++i3) { int a1 = tab[i1], a2 = tab[i2], a3 = tab[i3]; printf("sum3(%d,%d,%d) = %d\n", a1, a2, a3, sum3(a1,a2,a3)); } } } return 0; } Oppgave 2 .globl f f: movl 4(%esp),%eax addl 8(%esp),%eax addl 8(%esp),%eax addl 8(%esp),%eax addl 12(%esp),%eax ret Oppgave 3 Rett og slett å beregne a-b gir det vi ønsker; det gjelder uansett om a og b er positive eller negative. .globl intcmp intcmp: movl 4(%esp),%eax # return a subl 8(%esp),%eax # - b; ret Oppgave 4 #include #include char *my_strdup (char *s) { char *p = malloc(strlen(s)+1); if (p == NULL) return NULL; /* Hvorfor denne testen? */ strcpy(p, s); return p; } Oppgave 5 Jeg synes en rekursiv funksjon for å generere sifrene er den enkleste måten å få dem i riktig rekkefølge (men det finnes mange andre muligheter). #include static /* 'static' for funksjoner betyr 'private'. */ char *itoa_put (char *buf, int n) { if (n > 9) buf = itoa_put(buf, n/10); *buf = (n%10)+'0'; return buf+1; } char *my_itoa (int v) { char res[20], *resp = res; if (v < 0) { *resp = '-'; ++resp; v = -v; } resp = itoa_put(resp, v); *resp = 0; /* Husk 0-byte til slutt! */ return strdup(res); } Oppgave 6 Feilen oppstår fordi tallet 40000 ikke kan lagres i en 'short' som er 2 byte. Dette skjer binært: 20 000: 01001110 00100000 +20 000: 01001110 00100000 =40 000: 10011100 01000000 Dette tolkes som et negativt tall (siden første bit er 1), nemlig -25536. Oppgave 7 Tabellen er laget slik: For hvert tall 1-31 skriver vi den binære formen, for eksempel 19 desimalt = 10011 binært. Så skriver vi inn tallet i de kolonnene som har et 1-bit (A, D og E). Ved utregningen summerer vi bare disse 1-bitene multiplisert med riktig vekt som står øverst i hver kolonne. Feilen: I D-kolonnen står det 25; det skulle vært 23.