INF1070 Oppgaver uke 10 (6.-10.3.2006) (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 Standardfunksjonen i C char *strcat (char *a, char *b) utvider teksten a med b. Returverdien er rett og slett a. Skriv funksjonen i x86-kode. Den skal kalle på `strlen´ (vist på forelesningen 27.2.2006) for å få vite hvor lang a er. Eksempel på bruk: Testprogrammet #include #include extern char *mystrcat (char *a, char *b); char *data[] = { "", "a", "abc" }; int main (void) { int data_len = sizeof(data)/sizeof(char*), i1, i2; char c[20]; for (i1 = 0; i1 < data_len; ++i1) for (i2 = 0; i2 < data_len; ++i2) { strcpy(c, data[i1]); printf("strcat(\"%s\", \"%s\") = \"%s\"\n", data[i1], data[i2], mystrcat(c,data[i2])); } return 0; } skal skrive ut følgende: strcat("", "") = "" strcat("", "a") = "a" strcat("", "abc") = "abc" strcat("a", "") = "a" strcat("a", "a") = "aa" strcat("a", "abc") = "aabc" strcat("abc", "") = "abc" strcat("abc", "a") = "abca" strcat("abc", "abc") = "abcabc"