Ollaan tietokoneita. ============================================================ Tehtävä: x86-prosessorissa on rekistereitä (E)AX,BX,CX,DX,DI,SI,BP,SP ja IP. X-rekisteitä voidaan käyttää tavuittainkin nimellä H (high) ja L (low). Tavu on 8 bittiä eli heksana kaksi heksamerkkiä. IP rekisterissä on kulloinkin suoritettavan ohjelma askeleen muistiosoite. 1) Alla on (osa) rekisterit ja ohjelmamuisti. 2) Anna ohjelmamuistin ensimmäiselle tavulle (B3) jokin "osoite", esim. 0 tai 100 (tai vaikka 0040914D) 3) Laita tuo osoite (E)IP-rekisteriin. 4) Toista seuraavaa "loputtomiin": 5) Ota IP: osoittamassa paikassa oleva(t) tavu(t) ja katso käskyjen merkityksestä mitä silloin pitää tehdä. Käskyn suorituksen jälkeen lisää IP:n arvoa kuten käskyn kohdalla on sanottu. Rekisterit: =========== H L ----------------------------- EAX | | | | | ----------------------------- EBX | | | | | ----------------------------- ECX | | | | | ----------------------------- EDX | | | | | ----------------------------- EIP | | | | | ----------------------------- ... Ohjelmamuisti: ============== B3 62 80 FB 61 72 08 80 FB 7A 77 03 80 EB 20 A1 F4 .. .. .. Käskyjen merkitys: ================== 72 = jos vertailu oli pienempi, niin lisää ohjelmalaskuriin seuraavan tavun arvo IP+2 77 = jos vertailu ei ollut pienempi tai yhtäsuuri lisää ohjelmalaskuriin seuraavan tavun arvo IP+2 80 EB = vähennä BL-rekisterin arvosta seuraava tavu IP+3 80 FB = vertaa BL rekisterin arvoa seuraavana olevaan tavuun IP+3 A1 F4..= tulosta kirjaimena BL-rekisterissä oleva luku B3 = ota seuraavana oleva tavu ja laita se BL-rekisteriin IP+2 ============================================================ Assembler-kielisenä ==================== Konekieli Assembler ----------------------------------------------------------- kone.dpr.10: c := 'b'; 0040914D B362 mov bl,$62 kone.dpr.11: if ( c >= 'a' ) and ( c <= 'z' ) then 0040914F 80FB61 cmp bl,$61 00409152 7208 jb $0040915c 00409154 80FB7A cmp bl,$7a 00409157 7703 jnbe $0040915c kone.dpr.12: c := char(Ord(c) - (Ord('a')-Ord('A'))); 00409159 80EB20 sub bl,$20 kone.dpr.13: writeln(c); 0040915C A1F4A94000 mov eax,[$0040a9f4] 00409161 8BD3 mov edx,ebx 00409163 E840A3FFFF call @Write0Char 00409168 E877A3FFFF call @WriteLn ============================================================ Pascal-kielisenä: ================= program kone; var ci,c: char; begin c := 'b'; if ( c >= 'a' ) and ( c <= 'z' ) then c := char(Ord(c) - (Ord('a')-Ord('A'))); writeln(c); end.