INF1070 Oppgaver uke 9 (27.2.-3.3.2006) (De viktigste oppgavene er nr 1, 2 og 5.) Oppgave 1 Skriv C-funksjonen void swap (int *a, int *b) som bytter om to variable hvis adresser er gitt som parametre. Eksempel: #include extern void swap (int *a, int *b); int main (void) { int va = 17, vb = -3; printf("va = %d, vb = %d\n", va, vb); swap(&va, &vb); printf("va = %d, vb = %d\n", va, vb); return 0; } skal skrive ut: va = 17, vb = -3 va = -3, vb = 17 Oppgave 2 Skriv funksjonen i forrige oppgave som x86-assemblerkode. Oppgave 3 Skriv C-funksjonen void strrev (char *s) som snur rekkefølgen på tegnene i `s´. Eksempel: #include #include extern void strrev (char *s); int main (void) { char txt[100]; strcpy(txt, "Abc..0123456789"); strrev(txt); printf("Teksten er nå \"%s\".\n", txt); return 0; } vil skrive ut: Teksten er nå "9876543210..cbA". Hint: Bruk to pekere som starter i hver sin ende av teksten og går mot hverandre. Da kan man la de to tegnene pekerne peker på bytte plass. Oppgave 4 Skriv funksjonen fra forrige oppgave i x86-assemblerkode. Oppgave 5 Skriv funksjonen int summany (int a, ...) som summerer alle parametrene; funsjonen skal skrives i x86-assemblerkode. Det kan være vilkårlig mange patametre (dvs minst én) og en parameter 0 er alltid siste parameter (og den eneste 0 i parameterlisten). Eksempel: #include extern int summany (int a, ...); /* Ja, dette er lovlig C! */ int main (void) { int sum = summany(1, 2, 3, 99, -100, 0); printf("Summen er %d\n", sum); } skal skrive ut: Summen er 5 Hint: Her trenger du en peker som kan gå gjennom stakken. Den brukes til å summere tallene den peker på inntil den finner verdien 0. Oppgave 6 Skriv funksjonen int atoi (char *s) (som var i oppgavesettet for to uker siden), men denne gangen i x86-kode. Anta nå at det kun er sifre i `s´, altså ingen '-', blanke eller andre rare tegn. Hint: Algoritmen er den samme (bare litt enklere): res = 0; while (*s != 0) { c = *s-'0'; /* Konverter tegn til verdi. */ res = 10*res + c; ++s; }