INF2270 Oppgaver uke 11 (12.3-7.4.2008) Oppgave 1 P? lysark 6 i forelesningen 10.3 ble det vist en funksjon `arrayadd?. Her er den sammen med et testprogram: .globl arrayadd # Navn: arrayadd. # Synopsis: Summerer verdiene i en vektor. # C-signatur: int arrayadd (int n, int a[]). # 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 8(%ebp),%ecx # ix = n. movl 12(%ebp),%edx # a. a_loop: decl %ecx # while (--ix js a_exit # >=0) { addl (%edx,%ecx,4),%eax # sum += a[ix]. jmp a_loop # } a_exit: popl %ebp # return sum. ret # #include extern int arrayadd (int a[], int n); int a[] = { 100, 1, 2, 3, 4, 5, 6}; int main (void) { int a_len = (sizeof(a)/sizeof(int)), i; for (i = 0; i <= a_len; ++i) printf("n=%d: sum=%d\n", i, arrayadd(a,i)); return 0; } N? er det imidlertid lagt inn en feil i enten funksjonen eller testprogrammet slik at en kj?ring gir ?Segmentation fault?. Bruk feils?kingsverkt?y til ? finne feilen. Hint: Kildekoden til funksjonen og testprogrammet kan hentes fra ~inf2270/programmer/aa.s og ~inf2270/programmer/test-aa.c. Oppgave 2 X86-instruksjonen loop dit gj?r f?lgende: 1. Register ECX telles ned med 1. 2. Hvis ECX ikke er 0, hoppes til `dit?. Bruk denne instruksjonen til ? gj?re funksjonen `arrayadd? (se lysark 6 fra forelesningen 10.3) kortere. Det er for eksempel mulig ? skrive l?kken med bare to instruksjoner. Oppgave 3 (Ukens n?tt) Skriv en funksjon int littleendian (void) som returnerer ?sann? (dvs en annen verdi enn 0) om maskinen benytter ?little-endian? lagring. Funksjonen kan skrives i C eller x86-kode.