INF2270 L?sningsforslag oppgaver uke 11 (15.-19.3.2010) Oppgave 1 .globl arrayzeroes # Navn: arrayzeroes. # Synopsis: Finnet antall 0-er i en vektor. # C-signatur: int arrayzeroes (short a[], int n). # Registre: %eax: antallet s? langt # %ecx: indeks til a (teller ned) # %edx: adressen til a arrayzeroes: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl $0,%eax # ant = 0. movl 8(%ebp),%edx # a. movl 12(%ebp),%ecx # ix = n. a_loop: decl %ecx # while (--ix js a_exit # >=0) { cmpw $0,(%edx,%ecx,2)# if (a[ix] jnz a_loop # ==0) incl %eax # ++ant; jmp a_loop # } a_exit: popl %ebp # return ant. ret # Oppgave 2 int utf8_n_bytes (unsigned int c) { if ((c & 0xffffff80) == 0) return 1; if ((c & 0xfffff800) == 0) return 2; if ((c & 0xffff0000) == 0) return 3; return 4; } Oppgave 3 .globl n_ones # Navn: n_ones. # Synopsis: Finn antallet 1-er-bit. # C-signatur: int n_ones (unsigned int v) # Registre: %eax: teller antall 1-er-bit # %ecx: verdien v (som stadig skiftes mot h?yre) n_ones: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%edx # v. movl $0,%eax # ant = 0. # do { n_l: shrl $1,%edx # v >>= 1 /* og bit til C-flagg */ jnc n_n # if (C-flagg) incl %eax # ++ant. n_n: cmpl $0,%edx # } while (v jnz n_l # != 0) ; popl %ebp # return ant. ret # Oppgave 4 Feilen er at de to parametrene har omvendt rekkef?lge i funksjonen og testprogrammet. Oppgave 5 1. I rydd_opp kalles p? free for alle noder i treet, ogs? for toppnoden topp som er en vanlig variabel (og ikke opprettet med malloc). 2. Navnene (opprettet av strdup) blir ikke fjernet. Begge feilene rettes ved ? endre siste linje i rydd_opp til if (p != &topp) { free(p->navn); free(p); }