--*- coding: utf-8; -*-- INF2270 Oppgaver uke 12 (21.-25.3.2011) Oppgave 1 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 2 På forelesningen 14.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. Oppgave 3 Forelesningen 14.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.)