INF2270 Løsningsforslag oppgaver uke 11 (12.3-7.4.2008) Oppgave 1 Feil er at de to parametrene har omvendt rekkefølge i funksjonen og testprogrammet. Oppgave 2 .globl arrayadd # Navn: arrayadd. # Synopsis: Summerer verdiene i en vektor. # C-signatur: int arrayadd (int a[], int n). # Registre: %eax: summen så langt # %ecx: indeks til a (teller ned) # %edx: adressen til a arrayadd: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl $0,%eax # sum = 0. movl 12(%ebp),%ecx # ix = n. cmpl $0,%ecx # if (n == 0) je a_exit # goto a_exit. movl 8(%ebp),%edx # a. # for (ix=n; ix>0; --ix) { a_loop: addl -4(%edx,%ecx,4),%eax # sum += a[ix]. loop a_loop # } a_exit: popl %ebp # return sum. ret # Et par ting er verdt å merke seg: 1) Siden loop avslutter når ECX er null, må registeret ha verdiene n, n-1, ..., 1 gjennom løkken (og ikke n-1, n-2, ..., 0 som versjonen på forelesningen). Dette må vi kompensere ved å sette på en «-4» når vi skal ha tak i array-elementet. 2) Vi må nå teste på n==0 før vi starter løkken; hvorfor? Oppgave 3 En C-løsning: static short v = 1; int littleendian (void) { return *(char*)&v; } /* En alternativ løsning: */ static union { short s; char c[2]; } v2; int littleendian2 (void) { v2.s = 1; return v2.c[0]; } ... og en i assembler: .globl littleendian # Navn: littleendian # Synopsis: Er denne maskinen «little-endian»? # C-signatur: int littleendian (void). # Teknikk: Ser hvilken byte som er 1 i en short med verdi 1. littleendian: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl $0,%eax # Sett EAX til 0. movb v,%al # Hent venstre byte av v. popl %ebp # Standard ret # retur. .data v: .short 1