--*- coding: utf-8; -*-- INF2270 L?sningsforslag oppgaver uke 7 2013 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.