--*- coding: utf-8; -*-- INF2270 L?sningsforslag oppgaver uke 10 2015 Oppgave 1 .globl f1 # Navn: f1. # Synopsis: Beregner f1(x) = (x+1)*4. # C-signatur: int f1 (int x). # Registre: %eax Arbeidsregister f1: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # Hent x, incl %eax # ?k med 1 imull $4,%eax # og gang med 4. popl %ebp # Standard ret # retur. .globl f2 # Navn: f2. # Synopsis: Beregner f2(x) = x^4. # C-signatur: int f2 (int x). # Registre: %eax Arbeidsregister f2: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # Hent x imull %eax,%eax # og finn kvadratet imull %eax,%eax # to ganger. ((x^2)^2 = x^4) popl %ebp # Standard ret # retur. .globl f3 # Navn: f3. # Synopsis: Beregner f3(a,b,c) = if a<0 then b else c # C-signatur: int f3 (int a, int b, int c). # Registre: %eax Returverdien f3: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. cmpl $0,8(%ebp) # Sjekk a. jl velg_b # Hvis den er >= 0, velg_c: movl 16(%ebp),%eax # hent svaret c ; jmp retur # hvis ikke, velg_b: movl 12(%ebp),%eax # er svaret b. retur: popl %ebp # Standard ret # retur. .globl f4 # Navn: f4. # Synopsis: Beregner f4(a,b) = (a^2 + b^2)/2 # C-signatur: int f4 (int a, int b). # Registre: f4: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # Hent a imull %eax,%eax # og beregn kvadratet a^2. movl 12(%ebp),%ecx # Hent b imull %ecx,%ecx # og beregn kvadratet b^2. addl %ecx,%eax # Legg sammen de to og shrl $1,%eax # del p? 2 ved ? skifte. popl %ebp # Standard ret # retur. Oppgave 2 .globl odd # Navn: odd. # Synopsis: Er x et oddetall? # C-signatur: int odd (int x). # Forklaring: I alle oddetall (b?de positive og negative) er # nederste bit 1. Vi trenger derfor bare teste dette. # Registre: Arbeidsregister. odd: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # Hent x og andl $0x1,%eax # null ut alt annet enn det # nederste bit-et. popl %ebp # Standard ret # retur. Oppgave 3 Rett og slett ? beregne a-b gir det vi ?nsker; det gjelder uansett om a og b er positive eller negative. .globl intcmp intcmp: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%esp),%eax # return a subl 12(%esp),%eax # - b; popl %ebp # Standard ret # retur. Oppgave 4 Feilen oppst?r fordi tallet 40000 ikke kan lagres i en 'short' som er 2 byte. Dette skjer bin?rt: 20 000: 01001110 00100000 +20 000: 01001110 00100000 =40 000: 10011100 01000000 Dette tolkes som et negativt tall (siden f?rste bit er 1), nemlig -25536. Oppgave 5 Jeg synes en rekursiv funksjon for ? generere sifrene er den enkleste m?ten ? f? dem i riktig rekkef?lge (men det finnes mange andre muligheter). #include static /* 'static' for funksjoner betyr 'private'. */ char *itoa_put (char *buf, int n) { if (n > 9) buf = itoa_put(buf, n/10); *buf = (n%10)+'0'; return buf+1; } char *my_itoa (int v) { char res[20], *resp = res; if (v < 0) { *resp = '-'; ++resp; v = -v; } resp = itoa_put(resp, v); *resp = 0; /* Husk 0-byte til slutt! */ return strdup(res); }