--*- coding: utf-8; -*-- INF2270 Løsningsforslag oppgaver uke 14 2011 Oppgave 1 Forklaring: Vi kan løse oppgaven ved å dekode teksten tegn for tegn, men det finnes en enklere metode: Tell alle byte-ene men hopp over alle «forlengelses-bytene» som alle er 10xxxxxx. int utf8_len (unsigned char *utf) { unsigned char *u = utf; int len = 0; while (*u != 0) { if ((*u & 0xc0) != 0x80) ++len; ++u; } return len; } .globl utf8_len # Name: utf8_len. # Synopsis: Finner lengden av en UTF8-tekst. # C-signatur: int utf8_len (unsigned char *utf) # Teknikk: Teller antall byte unntatt 10xxxxxx-byte. # Registre: EAX: Teller antall tegn # CL: Hver enkelt-byte i teksten # EDX: Peker til byte i teksten (økes etterhvert) utf8_len: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl $0,%eax # Initiér EAX movl 8(%ebp),%edx # og EDX. ulen_l: movb (%edx),%cl # while ((CL = *(EDX incl %edx # ++)) cmpb $0,%cl # != 0) je ulen_x # { andb $0xc0,%cl # if ((CL & 0xc0) cmpb $0x80,%cl # != 0x80) je ulen_l # incl %eax # ++EAX; jmp ulen_l # } ulen_x: popl %ebp # Standard ret # retur. Oppgave 2 Link til løsningsforslag ligger samme sted som eksamensoppgaven.