TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli
Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne määrää sen minkälaisia käskyjä sille voidaan antaa -> käskykanta (Instruction set) Konekieli on joukko binäärisiä sanoja jotka vastaavat prosessorin käskyjä Assembly kieli antaa binäärisille bittijoukoille paremmin muistettavat vastineet, esim. 1111110111001000 M=M-1 Jokaiselle prosessorityypille on oma konekieli ja siten myös assembly kieli Korkeantason kieli Virtual machine Assembly kieli Konekieli Tietokonealusta Loogiset piirit
Tietokoneen toiminta HACK tietokone Hae A-käsky Suorita A-Käsky Hae C-käsky Suorita C-Käsky Toista alusta Normaali tietokone Hae käsky Suorita käsky Toista alusta
// C# koodia // Adds 1+...+5. int i = 1; int sum = 0; while (i <= 5){ sum += i; Console.WriteLine(sum); i++; } Esimerkkiohjelma // PSEUDO Assembly koodia Alusta muuttujat i=1 ja sum=0 (varaa niille paikka muistista) (LOOP) Laske i-5 Jos ALU output > 0 niin indeksi liian suuri, hyppää LOPPU:un muuten (ALU output <= 0) kasvata summaa kasvata indeksiä hyppää LOOP:iin (LOPPU) Lopeta ohjelma
// Hack assembly koodi @i // assembler -kääntäjää valitsee muistipaikan, jonne i tallennetaan M=1 // i=1 (sijoitetaan indeksin aloitusarvo yo. muistipaikkaan) @sum // assembler -kääntäjää valitsee muistipaikan, jonne sum tallennetaan M=0 // sum=0 (alustetaan summa nollaksi tallentamalla 0 sum -muuttujan muistipaikkaan) (LOOP) // määrittää hyppyosoitteen @i // Asetetaan A rekisterin arvoksi i -parametrin muistipaikka D=M // D=M[i] haetaan RAM muistin (M) osoitteesta i lukuarvo, tallennetaan D rekisteriin @5 // asetetaan A rekisteriin arvo 5 D=D-A // D=i-5 käytetään A rekisterin arvoa vakiona, ja vähennetään se indeksin i arvosta, ja tallennetaan D rekisteriin @END // asetetaan A rekisteriin mahdollinen hyppy osoite (PC:n uusi arvo) eli (END) rivin alapuolella olevan rivin osoite D;JGT // If (i-5)>0 goto END // tutkitaan onko D positiivinen (jolloin hypätään (END) - kohtaan) vai negatiivinen (ei hypätä, vaan jatketaan seuraavalle riville) @i // Asetetaan A rekisteriin i:n osoite D=M // D=M[i] haetaan i:n arvo muistista osoitteesta M[i] ja tallennetaan D rekisteriin @sum // asetetaan A rekisterin arvoksi sum parametrin osoite M=D+M // sum=i+sum // haetaan muistista M[sum] arvo yo. osoitteesta, lisätään se D rekisterin arvoon ja tallennetaan muistiin M[sum] osoitteeseen @i // Asetetaan A rekisteriin i:n osoite M=M+1 // i=i+1 // haetaan i:n arvo yo. osoitteesta, lisätään siihen 1 ja tallennetaan samaan osoitteeseen @LOOP // asetetaan A rekisteriin (LOOP) tekstin alapuolella olevan koodirivin numero (muistipaikka ROM muistissa) 0;JMP // Goto LOOP // lasketaan "nolla", ja riippumatta laskutoimituksen tuloksesta asetetaan ohjelmalaskurin (PC):n arvoksi yo. ROM muistipaikka (END) // määrittää hyppyosoitteen @END // Kirjan tekijöiden tapa lopettaa ohjelman suoritus (menemällä ikuiseen silmukkaan lopuksi) 0;JMP // Infinite loop
Assembly -käskyt A-Instruction @value Missä value on ei-negatiivinen kokonaisluku Binäärisenä: 0vvv vvvv vvvv vvvv Käytetään lukuarvon tallentamiseen A rekisteriin A rekisterin arvoa voidaan käyttää kolmella eri tavalla Tallennetaan vakio arvo (A = value) Valitaan RAM muistipaikka (register = RAM[A]) Valitaan ROM muistin seuraava suoritettava käsky (muistipaikka) (PC = A) A-Instruction:ia täytyy seurata C-Instruction, joka määrää mitä A rekisteriin tallennetulla lukuarvolla tehdään
Assembly -käskyt A-Instruction @47 // A=47 D=A // D=47 @47 // A=47 D=M // D=RAM[47] @47 // A=47 0;JMP // Ladataan PC:lle uusi arvo (ROM muistin muistipaikka, josta ohjelman suoritusta jatketaan)
Assembly -käskyt C-Instruction dest=comp;jump dest = M, D, MD, A, AM, AD, AMD tai null Kertoo minne laskutoimituksen comp tulos tallennetaan jump = JGT, JEQ, JGE, JLT, JNE, JLE, JMP tai null Kertoo millä ehdolla hypätään (ladataan ohjelmalaskurille (PC) uusi arvo) comp = 0, 1, -1, D, A,!D,!A, -D, -A, D+1, A+1, D-1, A-1, D+A, D-A, A-D, D&A, D A, M,!M, -M,M+1, M- 1, D+M, D-M, M-D, D&M, D M Kertoo ALU:lle mikä operaatio suoritetaan Ja minkä rekisterin/muistipaikan arvoja käytetään operaatiossa
dest=comp;jump @47 // 0000000000101111 D=A // 111accccccdddjjj @47 // 0000000000101111 D=M // 111accccccdddjjj @47 // 0000000000101111 0;JMP // 111accccccdddjjj comp dest jump Binäärinen: 1 1 1 a c1 c2 c3 c4 c5 c6 d1 d2 d3 j1 j2 j3 C-instruction Not used
Comp(ute) (a=0) c1 c2 c3 c4 c5 c6 (a=1) 0 1 0 1 0 1 0 1 1 1 1 1 1 1-1 1 1 1 0 1 0 D 0 0 1 1 0 0 A 1 1 0 0 0 0 M!D 0 0 1 1 0 1!A 1 1 0 0 0 1!M -D 0 0 1 1 1 1 -A 1 1 0 0 1 1 -M D+1 0 1 1 1 1 1 A+1 1 1 0 1 1 1 M+1 D-1 0 0 1 1 1 0 A-1 1 1 0 0 1 0 M-1 D+A 0 0 0 0 1 0 D+M D-A 0 1 0 0 1 1 D-M A-D 0 0 0 1 1 1 M-D D&A 0 0 0 0 0 0 D&M D A 0 1 0 1 0 1 D M
Hyppykäskyt j1 j2 j3 (out < 0) (out = 0) (out > 0) Mnemonic Effect 0 0 0 null No jump 0 0 1 JGT If out > 0 jump 0 1 0 JEQ If out = 0 jump 0 1 1 JGE If out 0 jump 1 0 0 JLT If out < 0 jump 1 0 1 JNE If out 0 jump 1 1 0 JLE If out 0 jump 1 1 1 JMP Jump Mnemonic muistisääntö (assembly kielinen toteutus)
Dest(ination) d1 d2 d3 Mnemonic Destination (minne tallennetaan) 0 0 0 null Operaation tulosta ei tallenneta 0 0 1 M Memory[A] (RAM muistipaikka A) 0 1 0 D D register 0 1 1 MD Memory[A] and D register 1 0 0 A A register 1 0 1 AM A register and Memory[A] 1 1 0 AD A register and D register 1 1 1 AMD A register, Memory[A], and D register
WHILE logiikka //while condition { //while (10-y<0) { while (y<10) { code block 1 // esim. y++ } code block 2 Assembly kielen käytäntö (LOOP) // D=10-y tai D=y-10 D // not condition // tallennetaan D:hen False // ehto, jolla hypätään @END D;JEQ // D 0 code block 1 //y++ etc. @LOOP 0;JMP (END) // D=0 false code block 2 True = -1 = (1111111111111111) 2 False = 0 = (0000000000000000) 2
IF logiikka //if condition { if (x!= 0) { code block 1 } else { // x==0 code block 2 } code block 3 Assembly kielen käytäntö D // negatoitu ehto (not x) // D =!x // jos x=0 -> D=!x=-1 (bin) // jos x=-1 -> D=!x=0 (bin) @IF_TRUE D;JEQ // if D==0 then jmp // else x==0 (D 0) code block 2 @END 0;JMP (IF_TRUE) // (x!= 0) code block 1 (END) code block 3 True = -1 = (1111111111111111) 2 False = 0 = (0000000000000000) 2
Code block 1 Draw_letter(A); Code block 2 Draw_letter(A); Code block 4 void Draw_letter(Char x) { Code block 3 } // minne? miten palataan? // jossain ROM muistissa (DRAW_LETTER) Code block 3 Assemblynä @takaisin // paluuosoite A=M // RAM muistista 0;JMP Aliohjelmakutsu Code block 1 Assemblynä // paluuosoite aliohjelmasta, // joka tallennetaan takaisin // muuttujaan @PALUUOSOITE D=A @takaisin M=D @DRAW_LETTER 0;JMP (PALUUOSOITE) // tänne Code block 2 Assemblynä @PALUUOSOITE2 D=A @takaisin M=D @DRAW_LETTER 0;JMP (PALUUOSOITE2) // vai tänne Code block 4 Assemblynä
Tietokoneen rakenne - väylä
Muisti ROM muisti, ladataan konekielinen ohjelma RAM muisti, käytetään ohjelman parametrien tallentamiseen I/O laitteet, näyttö ja näppis Memory-mapped I/O I/O laitteet kytketty samaan väylään kuin muisti Laitteilla oma muistiosoite Meillä RAM muistin jatkeena
RAM muisti Osoitteet 0-16383 (2^14 osoitetta, 14 bittinen osoite) Normaalia RAM muistia 16K Osoitteet 16384-24575 Näyttö 8192 (8k) muistipaikkaa 256 riviä, 512 pikseliä per rivi Mustavalkoinen näyttö Pikselin väri voidaan tallentaa yhteen bittiin 256*512*1 = 131072 bittiä Yhteen muistipaikkaan voidaan tallentaa 16 bittiä 131072/16 = 8192 muistipaikkaa Ei voida lukea, muistipaikkaan bittejä kirjoittamalla (muuttamalla 0 -> 1) saadaan pikseli mustaksi Osoite 24576 Näppäimistön muistiosoite Voidaan lukea mitä näppäintä on painettu