--*- coding: utf-8; -*-- INF2270 L?sningsforslag oppgaver uke 11 2015 Oppgave 1 .globl f # Navn: f. # Synopsis: Regner ut en formel. # C-signatur: int f (int a, int b, int x) # Registre: %eax - arbeidsregister # %ecx - svaret # %edx - arbeidsregister f: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%ecx # a imull 16(%ebp),%ecx # * b --> %ecx movl 12(%ebp),%eax # Regn ut b movl $0,%edx # idivl 16(%ebp) # / x og % x. addl %eax,%ecx # %ecx + b/x --> %ecx addl %edx,%ecx # %ecx + b%x --> %ecx movl %ecx,%eax # Return %ecx popl %ebp # med standard ret # retur. Tilleggssp?rsm?l: Virker denne l?sningen for alle verdier? Svar: Nei, kun for b>=0 pga konverteringen av b fra 32-bits verdi i %eax til 64-bits verdi i %edx:%eax som skjer ved ? sette inn 0-bit i %edx. Dette gir et galt svar for negative tall. Bedre er ? bruke instruksjonen cdq som vi ikke har nevnt hittil. Oppgave 2 .globl gcd # Navn: gcd. # Synopsis: Beregner st?rste felles divisor. # C-signatur: int gcd (int a, int b) # Registre: %ecx - parameteren a # %edx - parameteren b gcd: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart, movl 8(%ebp),%ecx # a --> %ecx movl 12(%ebp),%edx # b --> %edx gcd_loop: # while ( cmpl %ecx,%edx # %ecx != %edx ) je gcd_exit # { ja gcd_greater # if (%cx > %edx) subl %edx,%ecx # %ecx-%edx --> %ecx jmp gcd_loop # else gcd_greater: # subl %ecx,%edx # %edx-%ecx --> %edx jmp gcd_loop # } gcd_exit: # movl %ecx,%eax # return %ecx popl %ebp # med standard ret # reur.