--*- coding: utf-8; -*-- INF2270 Løsningsforslag oppgaver uke 14 2013 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: cmpl $0,%edx # Om v nå er = 0, jz n_x # er vi ferdig. shrl $1,%edx # Hvis ikke, skift v mot høyre; # bit-et som «faller utenfor», # havner i C-flagget jnc n_l # Hvis det var et 1-er-bit, incl %eax # øker vi telleren. jmp n_l # Så fortsetter vi. n_x: popl %ebp # Standard ret # retur. Oppgave 2 .globl arrayzeroes # Navn: arrayzeroes. # Synopsis: Finner 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); }