--*- coding: utf-8; -*-- INF2270 L?sningsforslag oppgaver uke 12 2015 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. Tillegg: Det finnes en instruksjon 'adcl' som oppf?rer seg som 'addl' men i tillegg tar med C-flagget i addisjonen. Med denne instruksjonen kan vi spare en instruksjon i l?kken. Hvordan ser koden ut da? Oppgave 2 Feilen er at de to parametrene har omvendt rekkef?lge i funksjonen og testprogrammet. Oppgave 3 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); }