INF2270 L?sningsforslag oppgaver uke 10 (5.-10.3.2008) Oppgave 1 char *mystrcpy (char *to, char *from) { char *tx = to, *fx = from; while (*fx != 0) { *tx = *fx; ++tx; ++fx; } *tx = 0; return to; } Oppgave 2 .globl mystrcpy # Navn: mystrcpy # Synopsis: Kopierer en tekst. # C-signatur: char *strcpy (char *to, char *from). # Registre: AL - tegnet som kopieres # CX - der neste tegn skal hentes fra (vil ?ke) # DX - der neste tegn skal plasseres (vil ?ke) mystrcpy: pushl %ebp # Standard movl %esp,%ebp # funksjonsstart. movl 8(%ebp),%edx # Initi?r EDX movl 12(%ebp),%ecx # og ECX. m_loop: movb (%ecx),%al # Hent neste tegn movb %al,(%edx) # og flytt det. cmpb $0,%al # Hvis tegner var 0, je m_exit # er vi ferdig. incl %ecx # ?k ECX incl %edx # og EDX og jmp m_loop # gjenta det hele. m_exit: movl 8(%ebp),%eax # Hent returvedien: to. popl %ebp # Standard ret # retur. Oppgave 3 void strrev (char *s) { char *t = s + strlen(s)-1; while (s < t) { char temp = *s; *s = *t; *t = temp; ++s; --t; } } Oppgave 4 Det er lurt ? dele problemet i to: 1. Finn slutten av teksten. 2. Bytt om tegnene. .globl strrev # Navn: strrev. # Synopsis: Snur en tekst. # C-signatur: void strrev (char *s). strrev: push %ebp # Standard funksjonsstart movl %esp,%ebp movl 8(%ebp),%eax # %eax = s. movl %eax,%edx # %eax = s. # Finn slutten av teksten: scan: cmpb $0,(%edx) # while (*s jz found # != 0) { incl %edx # ++s. jmp scan # } found: decl %edx # --s. # Snu teksten: rev: cmpl %eax,%edx # while (s < t jbe ret # ) { movb (%eax),%cl # Bytt *s movb (%edx),%ch # og *t (med %cl og movb %ch,(%eax) # %ch som mellomlager). movb %cl,(%edx) # incl %eax # ++s. decl %edx # --t. jmp rev # } ret: pop %ebp # Standard retur. ret Oppgave 5 .globl summany # Navn: summany. # Synopsis: Summerer diverse heltall. Verdien 0 svalutter. # C-signatur: int summany (int a, ...). # Registre: EAX: sum (resultatet) # EDX: sp (peker til parametrene p? stakken) summany: push %ebp # Standard funksjonsstart movl %esp,%ebp movl $0,%eax # sum = 0. movl %ebp,%edx # sp = %adx addl $8,%edx # +8. (F?rste parameter) # while ( loop: cmpl $0,(%edx) # *sp jz ret # != 0) { addl (%edx),%eax # sum += *sp. addl $4,%edx # sp += 4. (Neste parameter) jmp loop # } ret: pop %ebp # Standard retur. ret Oppgave 6 # EAX = a EDX = b xorl %eax,%edx # EAX = a EDX = b^a = a^b xorl %edx,%eax # EAX = a^(a^b) = b EDX = a^b xorl %eax,%edx # EAX = b EDX = (a^b)^b = a