INF2270 L?sningsforslag oppgaver uke 16 (16.-21.4.2008) Oppgave 1 float favg3c (float a, float b, float c) { return (a+b+c)/3.0; } .globl favg3 # Navn: : favg3 # Synopsis: Finner gjennomsnittet av tre flyt-tall. # C-signatur: float favg3 (float a, float b, float c) favg3: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. flds 8(%ebp) # Legg `a? flds 12(%ebp) # og `b? p? flyt-stakken faddp # og legg sammen. flds 16(%ebp) # Hent `c? faddp # og legg den til. fidivl Tre # Del p? 3.0. popl %ebp # Hent tilbake EBP. ret # Retur. .data Tre: .long 3 # Konstanten 3. Oppgave 2 .globl nbig # Navn: nbig. # Synopsis: Hvor mange ganger forekommer det st?rste tallet i en vektor? # C-signatur: short nbig (short a[], short n). # Registre: %ax - (ant) antallet forekomster # %bx - (max) det st?rste tallet # %cx - teller n, n-1, n-2, ..., 0 # %dx - arbeidsregister # %esi - adressene &a[0], &a[1], ... nbig: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. pushl %ebx # Gjem unna EBX pushl %esi # og ESI. # Finn f?rst den st?rste verdien: movl 8(%ebp),%esi # ESI = &a[0]. movl 12(%ebp),%ecx # CX = n. movw (%esi),%bx # max = a[0]. nb_max: decw %cx # while (--CX je nb_cnt # != 0) { addl $2,%esi # (++ESI). movw (%esi),%dx # DX = * cmpw %dx,%bx # if (DX > max) jge nb_max # movw %dx,%bx # max = DX. jmp nb_max # } # Tell s? antall ganger den forekommer: nb_cnt: movl 8(%ebp),%esi # ESI = &a[0]. movl 12(%ebp),%ecx # CX = n. movl $0,%eax # AX = 0. /* og null ut ?verste bitene i EAX */ # do { nb_eq: movw (%esi),%dx # DX = *ESI addl $2,%esi # ++. cmpw %bx,%dx # if (DX max) jne nb_tst # == incw %ax # ++AX. nb_tst: decw %cx # -- jnz nb_eq # } while ( CX != 0). nb_xit: popl %esi # Hent tilbake ESI, popl %ebx # EBX popl %ebp # og EBP. ret # return AX.