--*- coding: utf-8; -*-- INF2270 Løsningsforslag til oppgaver uke 13 2011 Oppgave 1 .globl x2 # Navn: x2. # Synopsis: Dobler en float-verdi. # Signatur i C: float x2 (float x). x2: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. flds 8(%ebp) # Legg x på x87-stakken. fld %st(0) # Legg på en kopi. faddp # Addér de to. # Svaret ligger nå på x87-stakken. popl %ebp # Standard ret # retur. Oppgave 2 Å doble et flyt-tall vil si å øke eksponenten med 1. Men tallet 0.0 må ikke endres. .globl x2 # Navn: x2. # Synopsis: Dobler en float-verdi. # Signatur i C: void x2 (float *px) # Teknikk: Øk eksponenten med 1. # Unntak: Tallet 0.0 skal ikke endres. x2: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%edx # Hent adressen til float-en. cmpl $0,(%edx) # Hvis float-en er 0, je x2_x # skal ikke noe endres. addl $0x00800000,(%edx) # Øk eksponenten med 1. x2_x: popl %ebp # Standard ret #retur. Oppgave 3 .globl setdata # Navn: setdata # Synopsis: Setter en verdi inn i bit-arrayen 'data'. # C-signatur: void setdata (unsigned int data[], int inx, int verdi) # Registre: EAX: Adressen til 'data' # ECX: Indeksen (til aktuelle int) # EDX: Bit-nummeret i aktuelle int setdata: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # EAX = &data[0]. movl 12(%ebp),%ecx # ECX = inx shrl $5,%ecx # / 32. movl 12(%ebp),%edx # EDX = inx andl $0x1f,%edx # % 32. testl $0x1,16(%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(unsigned int data[], int inx) # Registre: EAX: Adressen til 'data' # ECX: Indeksen (til aktuelle int) # EDX: Bit-nummeret i aktuelle int getdata: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # EAX = &data[0]. movl 12(%ebp),%ecx # ECX = inx shrl $5,%ecx # / 32. movl 12(%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 #