--*- coding: utf-8; -*-- INF1070 Oppgaver uke 9 (24.-28.2.2014) Oppgave 1 og 2 er viktigst denne uken. Oppgave 1 Skriv i assemblerspråk funksjonen int mul10 (int v) som returnerer 10*v. Du får bare bruke addl-instruksjoner til å beregne svaret, og du bør kunne klare deg med fire addl-er. Hint. Om EAX inneholder verdien v, hva kan du gjøre for at den skal bli 2*v? Og om den er 4*v, hva skal til for å få 5*v? Oppgave 2 Vi har hittil bare brukt EAX-registeret, men det finnes flere: ECX og EDX (og andre). Hva gjør denne assemblerfunksjonen? # Synopsis: ?? # C-signatur: int what (int v) .globl what what: movl 4(%esp),%eax movl $0,%ecx subl %eax,%ecx decl %ecx addl $2,%eax decl %ecx addl %ecx,%eax ret Oppgave 3 Tidligere brukte man ofte C-funksjonen 'gets' til å lese inn en linje med tekst. Den var gjerne definert slik: char *gets(char *s) { int c; char *p = s; c = getchar(); while (c!=EOF && c!='\n') { *p = (char)c; ++p; c = getchar(); } if (s == p) return NULL; *p = 0; return s; } (Funksjonen 'getchar' leser neste tegn fra «standard inn» som vanligvis er tastaturet; når det ikke er flere tegn igjen, returnerer den verdien EOF.) I dag har man innsett at denne funksjonen er farlig. Om man prøver å bruke den, får man advarsel fra kompilatoren: warning: the `gets' function is dangerous and should not be used. Og «man gets» er enda klarere: Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead. Hvorfor er denne funksjonen så farlig? Tilleggsspørsmål: Hvorfor er variabelen 'c' deklarert som int og ikke som char? (Dette er faktisk nødvendig for at funksjonen skal fungere skikkelig.) Hint: Finn definisjonen av EOF i /usr/include/stdio.h. Oppgave 4 (uken nøtt) Skriv C-funksjonen int my_atoib (char s[], int base) som fungerer som 'atoi' fra forrige uke, men hvor basen kan variere; den kan være fra 2 (binære tall) opp til 36 og sifrene kan være 0-9 og a-z eller A-Z. Tegn som ikke er lovlige sifre skal ignoreres. Eksempel: my_atoib("2de", 2) = 0 my_atoib("2de", 10) = 2 my_atoib("2de", 12) = 2 my_atoib("2de", 16) = 734 my_atoib("2de", 36) = 3074 my_atoib(" -13", 2) = -1 my_atoib(" -13", 10) = -13 my_atoib(" -13", 12) = -15 my_atoib(" -13", 16) = -19 my_atoib(" -13", 36) = -39 my_atoib(" 1FKZ ", 2) = 1 my_atoib(" 1FKZ ", 10) = 1 my_atoib(" 1FKZ ", 12) = 1 my_atoib(" 1FKZ ", 16) = 31 my_atoib(" 1FKZ ", 36) = 66851 my_atoib("z", 2) = 0 my_atoib("z", 10) = 0 my_atoib("z", 12) = 0 my_atoib("z", 16) = 0 my_atoib("z", 36) = 35 my_atoib("", 2) = 0 my_atoib("", 10) = 0 my_atoib("", 12) = 0 my_atoib("", 16) = 0 my_atoib("", 36) = 0