INF1070 Oppgaver uke 13 (27.-31.3.2006) Oppgave 1 Vedlagte funksjon skal gå gjennom en liste av samme type som benyttes i oblig 2 og finne det største ledige elementet. Imidlertid er det en feil i koden; bruk feilsøkingsverktøy til å finne denne feilen. .globl finnmax # Navn: finnmax # Synopsis: Finner største element i en liste. # C-signatur: char *finnmax (void) # Registre: EAX - maxadr - adresse til største element hittil # EBX - maxsiz - max størrelse hittil # ECX - px = *p - elementhodet i hvert element etter tur # EDX - p - peker på alle elementene etter tur finnmax: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. pushl %ebx # Gjem unna EBX # Initiering: movl $0,%eax # maxadr = 0. movl $0,%ebx # maxsiz = 0. # Søkeløkke: # while (1) { fm_l: movl (%edx),%ecx # px = *p andl $0x1,%ecx # & 0x1. jnz fm_n # if (px == 0) { movl (%edx),%ecx # px = *p. cmpl %ebx,%ecx # if (px jbe fm_n # > maxsiz) { movl %edx,%eax # maxadr = p. movl %ecx,%ebx # maxsiz = px. # } # } fm_n: movl (%edx),%ecx # px = *p andl $0xfffffffe,%ecx# & 0xfffffffe. jz fm_x # if (px==0) break. addl %ecx,%edx # p += px. jmp fm_l # } # Retur: fm_x: popl %ebx # Hent tilbake EBX. popl %ebp # retur ret # (med svaret i maxadr). .data .align 2 heap: .long 2048-4 # Blokk 1: size=2044, ledig .fill 2048-4-4 .long 1 # Blokk 2: size=0, opptatt Oppgave 2 Anta at vi har en «oblig 2-liste». Denne C-funksjonen går gjennom listen og sjekker om det finnes et ledig element med plass til minst n byte. Oversett funksjonen til x86-kode. int stor_nok (int n) { short *p = &«listen»; while (*p != 1) { if ((*p & 0x1==0) && (*p >= n+2)) return 1; /* Ja */ p += *p&0xfffe; } return 0; /* Nei */ } Oppgave 3 Anta at vi har en «oblig 2-liste» og at det første elementet er ledig og har størrelse 32 byte. Del dette i to like store deler, som begge skal være ledige.