--*- coding: utf-8; -*-- INF2270 Løsningsforslag til oppgaver uke 16 2013 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 4a. Parameteren 0x19 lagres slik i EAX: 00000000 00000000 00000000 00011001 Så roteres AL (og _bare_ det) 3 posisjoner mot venstre: 00000000 00000000 00000000 11001000 så svaret blir c8, altså alternativ 4. 4b. Følgende skjer: 1. EAX xor EAX gir EAX = 0x00000000 2. EAX xor 0x123456 gir EAX = 0x00123456 3. EAX and 0xffff gir EAX = 0x00003456 4. EAX or 0x11111111 gir EAX = 0x11113557 så riktig svar er alternativ 6. 4d. f4 beregner 1.0 + 1.0 og legger svaret (som en float) i f4val; dette (dvs en int bit-mønsteret til 2.0) er resultatverdien. Det lagres slik: + eksponent mantisse 0 10000000 00000000000000000000000 så alternativ 5 er rett.