INF1070 Oppgaver uke 13 (29.3.-1.4.2005) Oppgave 1 Standardfunksjoen char *strncpy (char *dest, char *src, int n) fungerer som `strcpy? men stopper etter ? ha kopiert n tegn (om den ikke har funnet en 0-byte inntil da). NB! ?Thus, if there is no null byte among the first n bytes of src, the result will not be null-terminated.? (Fra man-siden) Skriv funksjonen f?rst i C og s? i x86. Oppgave 2 En C-funksjon som beregner resten ved divisjon med 16, kan skrives slik: unsigned int modulo16(unsigned int x) { return x%16; } Eksempel: modulo16(39) gir 7 Det er imidlertid mulig ? skrive funksjonen uten ? bruke %-operatoren (f eks fordi den er ganske langsom) men benytte maskeoperasjonen AND i stedet. Omskriv C-koden for `modulo16' til ? bruke AND, og skriv ogs? den nye funksjonen i x86 assemblerkode. Hint: Hvorledes ser bit-m?nsteret ut for argumentet (f eks 39) og svaret (f eks 7)? Oppgave 3 Vi vet at movl $0,%eax nuller ut EAX-registeret. Finn flere andre enkeltinstruksjoner som har samme effekten. (Det finnes minst 4 andre.) Oppgave 4 Oversett denne C-funksjonen til x86-kode: int n_odde (int a[], int n) { int i, res = 0; for (i = 0; i < n; ++i) if (a[i]%2 != 0) ++res; return res; } Hint. Hvordan finner man enkelt med 1 instruksjon ut om et tall er et oddetall? Tenk bit-m?nstre!