--*- coding: utf-8; -*-- INF2270 L?sningsforslag oppgaver uke 12 2012 Oppgave 1 .globl n_ones # Navn: n_ones. # Synopsis: Finner antall 1-er-bit. # C-signatur: int n_ones (unsigned int v). # Registre: EAX - teller 1-er-bit # EDX - v (men skiftes mot h?yre etter hvert) n_ones: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%edx # Hent v. movl $0,%eax # Ingen 1-er-bit hittil. n_l: shrl $1,%edx # Skift v mot h?yre; bit-et som # ?faller utenfor?, havner i C-flagget adcl $0,%eax # og adderes til telleren. cmpl $0,%edx # Er det 1-er-bit igjen i v? jnz n_l # I s? fall gjentar vi l?kken. popl %ebp # Standard ret # retur. Oppgave 2 .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 3 Feilen er at de to parametrene har omvendt rekkef?lge i funksjonen og testprogrammet. Oppgave 4 Navnene (opprettet av strdup) blir ikke fjernet. Feilen rettes ved ? skyte inn en linje i rydd_opp: void rydd_opp (struct node *p) { if (p->v) rydd_opp(p->v); if (p->h) rydd_opp(p->h); free(p->navn); if (p != &topp) free(p); }