INF2270 L?sningsforslag til oppgaver uke 15 2010 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: 澳门葡京手机版app下载n 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: 澳门葡京手机版app下载n 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 # Oppgave 4 L?sningsforslag finnes samme sted som oppgaven.