INF2270 Oppgaver uke 11 (15.-19.3.2010) 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 Les om Unicode og UTF-8 i kompendiet. Skriv C-funksjonen int utf8_n_bytes (unsigned int c) som returnerer antall byte man trenger for ? lagre Unicode-tegnet c. Testprogram #include extern int utf8_n_bytes (unsigned int c); unsigned int c[] = { 0, 0x24, 0xA2, 0x20AC, 0x24B62 }; int main (void) { int c_len = (sizeof(c) / sizeof(unsigned int)), i; for (i = 0; i < c_len; ++i) printf("0x%06x trenger %d byte\n", c[i], utf8_n_bytes(c[i])); return 0; } skriver ut 0x000000 trenger 1 byte 0x000024 trenger 1 byte 0x0000a2 trenger 2 byte 0x0020ac trenger 3 byte 0x024b62 trenger 4 byte Oppgave 3 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 Oppgave 4 P? forelesningen 9.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 5 Forelesningen 15.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.)