INF1070 Løsningsforslag oppgaver uke 10 (5.-9.3.2007) Oppgave 1 .globl min3x # Navn: min3x # Synopsis: Finner minste av tre tall. # C-signatur: int min3x (int a, int b, int c) # Registre: %eax - mulig resultatverdi min3x: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # Prøv først a. cmpl %eax,12(%ebp) # Hvis a > b, jle not_a # gå til not_a. # Nå vet vi at svaret er a eller c. cmpl %eax,16(%ebp) # Hvis a > c, jl is_c # gå til is_c. jmp m3_xit # Hvis ikke, er svaret a (som # allerede ligger i %eax). # Nå vet vi at svaret er b eller c. not_a: movl 12(%ebp),%eax # Prøv b. cmpl %eax,16(%ebp) # Hvis b < c, jge m3_xit # gå til m3_xit siden svaret er b # (som allerede ligger i %eax). # Nå vet vi at svaret er c. is_c: movl 16(%ebp),%eax # Legg c i %eax. m3_xit: popl %ebp # Standard ret # retur. Oppgave 2 Spesielt å merke seg: * Vi må bruke `ja' og `jb' siden vi vil teste «unsigned». * Vi bruker `movb' og `cmpb' siden vi skal arbeide med tegn (som er 1 byte store). .globl mystrcmp # Navn: mystrcmp. # Synopsis: Sammenligner to tekster (som `strcmp'). # C-signatur: int mystrcmp (unsigned char *a, unsigned char *b) # Registre: %eax - tegnene i a # %ecx - går gjennom tegnene i a # %edx - går gjennom tegnene i b mystrcmp: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%ecx # Hent a. movl 12(%ebp),%edx # Hent b. cmp_loop: # while (1) { movb (%ecx),%al # c = *a. cmpb %al,(%edx) # if (*b > c) ja cmp_above # goto cmp_above. jb cmp_below # if (*b < c) goto cmp_below. cmpb $0,%al # if (c == 0) je cmp_equal # goto cmp_equal. incl %ecx # ++a. incl %edx # ++b. jmp cmp_loop # } cmp_above: movl $-1,%eax # return -1. jmp cmp_exit cmp_equal: movl $0,%eax # return 0. jmp cmp_exit cmp_below: movl $1,%eax # return 1. cmp_exit: popl %ebp # Standard ret # retur. Oppgave 3 Vi kan omforme ved å sette bit nr 5. A: 01000001 a: 01100001 ^ (Om det allerede er satt, skader det ikke å sette det på nytt.) .globl downcase # Navn: downcase. # Synopsis: Omformer til små bokstaver. # C-signatur: int downcase (int c). downcase: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%eax # Hent tegnet c. orb $0x20,%al # Omform. popl %ebp # Retur. ret #