INF2270 Oppgaver uke 10 (5.-10.3.2008) (De viktigste oppgavene er nr 1, 2 og 5.) Oppgave 1 Skriv standard C-funksjonen char *strcpy (char *to, char *from) som kopierer teksten som `from? peker p? over til dit `to? peker. Returverdien skal v?re pekeren `to?. 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 naturligivs 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 (ukens n?tt) Det er mulig ? bytte om innholdet av to x86-registre ved ? bruke tre xorl-instruksjoner og uten ? bruke andre registre eller minnet. Skriv instruksjonene som bytter om EAX og EDX. Hint. Hva skjer om vi gj?r XOR to ganger med samme maske?