INF1070 Oppgaver uke 10 (5.-19.3.2007) (Oppgavene st?r i prioritert rekkef?lge: oppgave 1 er viktigst.) Oppgave 1 Denne C-funksjonen finner det minste av tre tall: int min3 (int a, int b, int c) { if (a < b) { /* Svaret er enten a eller c. */ if (a < c) return a; return c; } /* Svaret er enten b eller c. */ if (b < c) return b; return c; } Oversett funksjonen til x86-assemblerkode. Oppgave 2 Standard-funksjonen i C int strcmp (unsigned char *a, unsigned char *b) sammenligner to tekster og returnerer en verdi <0 om a kommer f?r b 0 om de to er like en verdi >0 om a kommer etter b Skriv funksjonen i x86-kode. Hint: Skriv funksjonen i C f?rst. Eksempel p? bruk: #include extern int mystrcmp (unsigned char *a, unsigned char *b); char *data[] = { "", "a", "abc", "ab?" }; int main (void) { int data_len = sizeof(data)/sizeof(char*), i1, i2; for (i1 = 0; i1 < data_len; ++i1) for (i2 = 0; i2 < data_len; ++i2) printf("strcmp(\"%s\", \"%s\") = %d\n", data[i1], data[i2], mystrcmp(data[i1],data[i2])); return 0; } skal skrive ut strcmp("", "") = 0 strcmp("", "a") = -1 strcmp("", "abc") = -1 strcmp("", "ab?") = -1 strcmp("a", "") = 1 strcmp("a", "a") = 0 strcmp("a", "abc") = -1 strcmp("a", "ab?") = -1 strcmp("abc", "") = 1 strcmp("abc", "a") = 1 strcmp("abc", "abc") = 0 strcmp("abc", "ab?") = -1 strcmp("ab?", "") = 1 strcmp("ab?", "a") = 1 strcmp("ab?", "abc") = 1 strcmp("ab?", "ab?") = 0 Det vil si, den kan skrive ut et vilk?rlig negativt tall istedenfor -1 og et vilk?rlig positivt tall istedenfor 1. 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('?') = '?'