INF2270 L?sningsforslag oppgaver uke 18 (30.4.-4.5.2007) Oppgave 1 .globl safeadd # Navn: safeadd. # Synopsis: Adderer to tall -- gir 0 om overflyt. # C-signatur: int safeadd (int a, int b). # Registre: %eax - a og svar safeadd: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # Hent a addl 12(%ebp),%eax # og adder b. jno sa_x # Om overflyt, movl $0,%eax # sett svaret til 0. sa_x: popl %ebp # ret # Retur. .globl safemul # Navn: safemul. # Synopsis: Multipliserer to tall -- gir 0 om overflyt. # C-signatur: int safemul (int a, int b). # Registre: %eax - a og svar # %edx - arbeidsregister safemul: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # Hent a imull 12(%ebp) # og gang med b. jno sm_x # Om overflyt, movl $0,%eax # sett svaret til 0. sm_x: popl %ebp # ret # Retur. Oppgave 2 .globl neven # Navn: neven. # Synopsis: Finner alle partall i en vektor med 100 elementer. # C-signatur: short neven (short a[]). # Registre: %eax: n # %ebx: arbeidsregister # %ecx: teller 100, 99, ..., 0. # %edx: *a (?kes etter hvert) neven: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. pushl %ebx # Gjem unna register EBX. movl $0,%eax # n = 0. movl $100,%ecx # teller = 100. movl 8(%ebp),%edx # Initier *a til a[0]. ne_l: movw (%edx),%bx # a[i] andw $1,%bx # & 1. addw %bx,%ax # n += addl $2,%edx # ++ a. decl %ecx # -- jnz ne_l # G? i l?kke til n er 0. ne_x: popl %ebx # Hent tilbake EBX. popl %ebp # ret # Retur.