INF1070 L?sningsforslag oppgaver uke 8 2010 Oppgave 1 .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 2 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! Oppgave 3 Funksjonen er farlig fordi det ikke er noen sjekk p? om det er plass til den innleste linjen. Hvis brukeren gir en lang linje, vil linjen overskrive andre variable eller til og med programkode. Noen har brukt dette til ? bryte seg inn i datasystemer ved ? oppgi for eksempel passord p? flere tusen tegn. EOF er definert som # define EOF (-1) Funksjonen 'getchar' kan alts? returnere 257 ulike verdier: -1 til 255. Vi kan ikke lagre s? mange verdier i en char. Oppgave 4 #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; }