--*- coding: utf-8; -*-- INF1070 Løsningsforslag oppgaver uke 9 2014 Oppgave 1 .globl mul10 mul10: movl 4(%esp),%eax # EAX = v addl %eax,%eax # EAX = v+v = 2v addl %eax,%eax # EAX = 2v+2v = 4v addl 4(%esp),%eax # EAX = v+4v = 5v addl %eax,%eax # EAX = 5v+5v = 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 variabler 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])