--*- coding: utf-8; -*-- INF2270 Oppgaver uke 14 (31.4.-4.4.2014) Oppgave 1 Skriv x86-funksjonen 'n_ones': int n_ones (unsigned int v) som finner antall 1-er-bit i v. Testprogrammet #include extern int n_ones (unsigned int v); int main (void) { unsigned int i; for (i = 0; i <= 100; i += 13) printf("0x%02x har %d 1-er-bit\n", i, n_ones(i)); return 0; } skriver ut 0x00 har 0 1-er-bit 0x0d har 3 1-er-bit 0x1a har 3 1-er-bit 0x27 har 4 1-er-bit 0x34 har 3 1-er-bit 0x41 har 2 1-er-bit 0x4e har 4 1-er-bit 0x5b har 5 1-er-bit Hint: Hvordan kan man enkelt se på bit etter bit i et register? Oppgave 2 Skriv x86-funksjonen 'arrayzeroes' med denne signaturen: int arrayzeroes (short a[], int n) som går gjennom array-en a med n elementer og teller antall elementer som er 0. Hint: Husk at en short er på 2 byte. Testprogram: #include extern int arrayzeroes (short a[], int n); short a[] = { 100, 1, 0, 0, 4, 5, 0}; int main (void) { int a_len = (sizeof(a)/sizeof(short)); printf("Svaret er %d\n", arrayzeroes(a,a_len)); return 0; } skriver Svaret er 3 Oppgave 3 På forelesningen 18.3 ble det vist en funksjon 'arrayadd'. Her er den sammen med et testprogram: .globl arrayadd # Navn: arrayadd. # Synopsis: Summerer verdiene i en vektor. # C-signatur: int arrayadd (int n, int a[]). # Registre: %eax: summen så langt # %ecx: indeks til a (teller ned) # %edx: adressen til a arrayadd: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl $0,%eax # sum = 0. movl 8(%ebp),%ecx # ix = n. movl 12(%ebp),%edx # a. a_loop: decl %ecx # while (--ix js a_exit # >=0) { addl (%edx,%ecx,4),%eax # sum += a[ix]. jmp a_loop # } a_exit: popl %ebp # return sum. ret # #include extern int arrayadd (int a[], int n); int a[] = { 100, 1, 2, 3, 4, 5, 6}; int main (void) { int a_len = (sizeof(a)/sizeof(int)), i; for (i = 0; i <= a_len; ++i) printf("n=%d: sum=%d\n", i, arrayadd(a,i)); return 0; } Nå er det imidlertid lagt inn en feil i enten funksjonen eller testprogrammet slik at en kjøring gir «Segmentation fault». Bruk feilsøkingsverktøy til å finne feilen. Hint: Kildekoden til funksjonen og testprogrammet kan hentes fra ~inf2270/programmer/aa.s og ~inf2270/programmer/test-aa.c eller fra nettsiden http://inf2270.at.ifi.uio.no/programmer/. Oppgave 4 Forelesningen 18.3 ble avsluttet med et eksempel hvor det var flere feil i forbindelse med allokering (malloc) og frigiving (free) av plass. Hvilke feil finner du? (Koden til navn.c kan hentes fra ~inf2270/programmer/navn.c eller nettsiden http://inf2270.at.ifi.uio.no/programmer/.)