INF2270 L?sningsforslag oppgaver uke 13 (23.-27.3.2009) 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. popl %ebp # Hent tilbake EBP. ret # Retur. .data Tre: .long 3 # Konstanten 3. Oppgave 2 .globl setdata # Navn: setdata # Synopsis: Setter en verdi inn i bit-arrayen 'data'. # C-signatur: void setdata(int inx, int verdi) # Registre: EAX: 澳门葡京手机版app下载n til 'data' # ECX: Indeksen (til aktuelle int) # EDX: Bit-nummeret i aktuelle int setdata: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. lea data,%eax # EAX = &data[0]. movl 8(%ebp),%ecx # ECX = inx shrl $5,%ecx # / 32. movl 8(%ebp),%edx # EDX = inx andl $0x1f,%edx # % 32. testl $0x1,12(%ebp) # Test bit 0 i 'verdi'. jz set0 # Hvis det er 1, btsl %edx,0(%eax,%ecx,4) # sett riktig bit til 1 jmp setx # men hvis det er 0, set0: btrl %edx,0(%eax,%ecx,4) # sett riktig bit til 0. setx: popl %ebp # Retur. ret # .globl getdata # Navn: getdata # Synopsis: Henter en verdi i bit-arrayen 'data'. # C-signatur: int getdata(int inx) # Registre: EAX: 澳门葡京手机版app下载n til 'data' # ECX: Indeksen (til aktuelle int) # EDX: Bit-nummeret i aktuelle int getdata: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. lea data,%eax # EAX = &data[0]. movl 8(%ebp),%ecx # ECX = inx shrl $5,%ecx # / 32. movl 8(%ebp),%edx # EDX = inx andl $0x1f,%edx # % 32. btl %edx,0(%eax,%ecx,4) # Test bit-et (svar i C-flagg) movl $0,%eax # EAX = 0 adcl $0,%eax # + 0 + C. popl %ebp # Retur. ret # .data data: .fill 4*31250 # Plass til 31250 int-er Oppgave 2 fra eksamen 2004 i INF103 .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. Fasit til de ?vrige eksamensoppgavene finner du samme sted som oppgavetekstene.