INF1070 Oppgaver uke 10 (7.-11.3.2005) Oppgave 1 Standardfunksjonen char *index (char *s, char c) finner f?rste forekomst av tegnet c i teksten s og returnerer adressen til tegnet. Hvis tegnet ikke finnes, skal returverdien v?re 0. Skriv funksjonen f?rst i C og deretter i x86. Eksempel: #include #include extern char *myindex (char *s, int c); char data[] = { 'a', 'd', ' ', '.' }; int main (void) { int data_len = sizeof(data)/sizeof(char), i; char s[100]; strcpy(s, "abcdef...z"); printf("&s = 0x%08x\n", &s); for (i = 0; i < data_len; ++i) printf("index(\"%s\",'%c') = 0x%08x\n", s, data[i], myindex(s,data[i])); return 0; } skal skrive ut: &s = 0xbfffd770 index("abcdef...z",'a') = 0xbfffd770 index("abcdef...z",'d') = 0xbfffd773 index("abcdef...z",' ') = 0x00000000 index("abcdef...z",'.') = 0xbfffd776 (NB! Det vil variere hvilke adresser som skrives ut, men _forskjellen_ mellom dem skal v?re den samme.) Oppgave 2 Standardfunksjonen char *rindex (char *s, int c) fungerer som `index' men finner _siste_ forekomst. Skriv denne funksjonen i C og i x86-kode. Eksempel: #include #include extern char *myrindex (char *s, int c); char data[] = { 'a', 'd', ' ', '.' }; int main (void) { int data_len = sizeof(data)/sizeof(char), i; char s[100]; strcpy(s, "abcdef...z"); printf("&s = 0x%08x\n", &s); for (i = 0; i < data_len; ++i) printf("rindex(\"%s\",'%c') = 0x%08x\n", s, data[i], myrindex(s,data[i])); return 0; } skal skrive ut: &s = 0xbfffa6f0 rindex("abcdef...z",'a') = 0xbfffa6f0 rindex("abcdef...z",'d') = 0xbfffa6f3 rindex("abcdef...z",' ') = 0x00000000 rindex("abcdef...z",'.') = 0xbfffa6f8 Oppgave 3 Skriv x86-funksjonen int downcase (int c) som omformer en stor bokstav til den tilsvarende lille bokstaven. Sm? bokstaver skal forbli de samme. Vi antar at parameteren c alltid er en bokstav (dog ikke ? og ?). Hint: Det er nok med ?n instruksjon (foruten de som er med i alle funksjoner for ? ta seg av registerinitiering og retur). Hint. Se p? en oversikt over tegnsettet vi bruker (for eksempel ~dag/www_docs/ISO8859-table.pdf) og studer bit-m?nsteret for for eksempel 'A' og 'a'. Eksempel: Programmet #include extern int downcase (int c); char data[] = { 'a', 'A', 'w', '?', '?' }; int main (void) { int data_len = sizeof(data)/sizeof(char), i; for (i = 0; i < data_len; ++i) printf("downcase('%c') = '%c'\n", data[i], downcase(data[i])); return 0; } skal skrive ut: downcase('a') = 'a' downcase('A') = 'a' downcase('w') = 'w' downcase('?') = '?' downcase('?') = '?' Oppgave 4 Hva gj?r f?lgende tre instruksjoner: xorl %ecx,%edx xorl %edx,%ecx xorl %ecx,%edx Det er noe fornuftig. Hint. Pr?v med to tilfeldige verdier, for eksempel 17 og 3, i %ecx og %edx og simuler hva som skjer. Konklusjon. Dokumentasjon er viktig! Det er lett ? skrive assemblerkode som er uforst?elig for andre. Oppgave 5 Oversett funksjonen int daysec (int hours, int mins, int secs) { return (hours*60 + mins)*60 + secs; } til x86-kode. Funksjonen regner ut hvor mange sekunder det er g?tt til et gitt tidspunkt p? dagen. Eksempel: #include extern int daysec (int hours, int mins, int secs); int main (void) { int h = 7, m = 29, s = 32; printf("daysec(%d,%d,%d) = %d\n", h, m, s, daysec(h,m,s)); return 0; } skal skrive ut daysec(7,29,32) = 26972