INF2270 Oppgaver uke 14 (5.-9.4.2010) (Oppgave 1 er viktigst denne uken.) Oppgave 1 Skriv funksjonen int utf8_len (unsigned char *utf) som finner lengden (alts? antall tegn, ikke antall byte) i s som er en tekst som er kodet i UTF-8. (Som andre tekster i C avsluttes den med en byte med verdien 0.) Testprogrammet #include #include extern int utf8_len (unsigned char *utf); unsigned char *s = "Noen s\xc3\xa6re tegn"; int main (void) { printf("Teksten har %d tegn.\n", utf8_len(s)); return 0; } skal skrive ut Teksten har 14 tegn. Hint. Tenk p? hvilke situasjoner som kan forekomme; det er nemlig mulig ? l?se problemet mye enklere enn en rett-fram-l?sning. 1a. Skriv funksjonen i C. 1b. Skriv funksjonen i x86-assembler. Oppgave 2 S?kalt ?run-length?-koding er en enkel komprimeringsmetode. Man angir bare en repetisjonsfaktor (0-9 i dette tilfellet) foran de tegn som skal gjentas; se eksemplet nedenfor. Oppgave 2a Skriv C-funksjonen void rlcopy (char *to, char *from) som kopierer en tekst fra 'from' til 'to' men som ekspanderer tegn med et ¨Śn-sifret tall foran. Her er et eksempel p? bruken: #include extern void rlcopy (char *to, char *from); char *data[] = { "", "Abc", "Hu2ra!", "Adj0x0x1?", "11 milliard er 1190" }; int main (void) { char res[200]; int n = sizeof(data)/sizeof(char*), i; for (i = 0; i < n; ++i) { rlcopy(res, data[i]); printf("rlcopy(\"%s\") -> \"%s\"\n", data[i], res); } return 0; } Resultatet at dette er rlcopy("") -> "" rlcopy("Abc") -> "Abc" rlcopy("Hu2ra!") -> "Hurra!" rlcopy("Adj0x0x1?") -> "Adj?" rlcopy("11 milliard er 1190") -> "1 milliard er 1000000000" Oppgave 2b Skriv funksjonen i x86-assemblerkode. Oppgave 3 (ukens n?tt) Det er mulig ? bytte om innholdet av to x86-registre ved ? bruke tre xorl-instruksjoner og uten ? bruke minnet eller andre registre. Skriv instruksjonene som bytter om EAX og EDX. Hint. Hva skjer om vi gj?r XOR to ganger med samme maske?