INF1070 L?sningsforslag oppgaver uke 8 (20.-25.2.2008) Oppgave 1 #include #include static int digval (char c) { /* Hvilken verdi har sifferet `c?? */ /* Returner -1 om ikke siffer 0-9, a-z eller A-Z. */ if ('0'<=c && c<='9') return c-'0'; if ('a'<=c && c<='z') return c-'a'+10; if ('A'<=c && c<='Z') return c-'A'+10; return -1; } int my_atoib (char s[], int base) { int sign = 1, ix = 0, res = 0; while (s[ix] && s[ix]!='-' && (digval(s[ix])<0 || digval(s[ix])>=base)) ++ix; if (s[ix] == '-') { sign = -1; ++ix; } while (digval(s[ix])>=0 && digval(s[ix]) #include #include static char digit (int v) { if (v <= 9) return '0'+v; return 'a'+v-10; } static char *itoa_put (char *buf, int n, int base) { if (n >= base) buf = itoa_put(buf, n/base, base); *buf = digit(n%base); return buf+1; } char *my_itoa (int v, int base) { char res[200], *resp = res; if (v < 0) { *resp = '-'; ++resp; v = -v; } resp = itoa_put(resp, v, base); *resp = 0; return strdup(res); } int data[] = { 212, -13, 35, 123177, 0 }; int basetab[] = { 2, 10, 12, 16, 36 }; int main (void) { int data_len = sizeof(data)/sizeof(int), ix, base_len = sizeof(basetab)/sizeof(int), ib; for (ix = 0; ix < data_len; ++ix) { for (ib = 0; ib < base_len; ++ib) { char *s = my_itoa(data[ix],basetab[ib]); printf("my_itoab(%d,%d) = \"%s\"\n", data[ix], basetab[ib], s); free(s); } } return 0; } Oppgave 3 .globl mul10 mul10: movl 4(%esp),%eax # eax = v addl %eax,%eax # eax = 2v addl %eax,%eax # eax = 4v addl 4(%esp),%eax # eax = 5v addl %eax,%eax # eax = 10v ret Oppgave 4 Funksjonen returnerer alltid 0. Den beregner v+2 i %eax 0-v-1-1 = -(v+2) i %ecx f?r den summerer de to tallene og f?r 0. Moral: Dokumentasjon er viktig!