E10 Hoe werkt een computer nu precies? Ben Bruidegom Wouter Koolen-Wijkstra Inhoudsopgave 1. Practicum met de Rekenmachine I (8 min)....................................................................2 2. Wat gebeurt er precies als een “loopje” wordt uitgevoerd? (6 min)..............................4 3. Wat gebeurt er in een Pipeline Processor ( 6 min )........................................................6 2 1. Practicum met de Rekenmachine I (8 min) S1 0 0 1 1 S0 0 1 0 1 Operator + (plus) - (min) & (bitwise AND) B wordt doorgelaten Tabel 1 ALU Instructie ADD rd, rs, rt SUB rd, rs, rt AND rd, rs, rt COPY rd, rt Functie Y=A+B Y=A-B Y = A AND B Y=B Betekenis Voorbeeld Optellen registers ADD $7, $3, $4 Aftrekken registers SUB $7, $3, $4 Bitwise-AND registers AND $7, $3, $4 Kopieer register COPY $7, $4 Tabel 2 Instructieset rekenmachine Betekenis r7 r3 + r4 r7 r3 – r4 r7 r3 & r4 r7 r4 Starten van de simulator Open de folder SIM-PL2.1.1. Dubbelklik op de file Executer.jar. Klik op het icoon: (Open a new Worksheet). Klik op Componenten Rekenmachine_I . Open de file Rekenmachine_I.simpl-ws. De User Interface laat vier Windows zien: ♦ “Component Window”. Hier wordt de “Rekenmachine I” afgebeeld. ♦ “Instance Editor: Instruction Memory”. Hier kun je het “Instruction Memory” bekijken. ♦ “Instance Editor: Registers”. Hier kun je de “Registers” bekijken. ♦ “Program Editor”. Dit venster wordt gebruikt om een assembly-programma te laden of te schrijven. Opdracht 1: Laden, compileren executeren van een programma Ga naar de menu-optie File van de ‘Program Editor’. Open het programma ‘Opdracht1.wasm’. Het volgende programma verschijnt: # Rekenmachine_I WASM program @include "Rekenmachine_I.wasm" #-teken is het teken voor commentaar # Deze regel altijd toevoegen .data MyData : REGISTERS registers 3: WORD 7 4: WORD 5 # Het programma start met data in .code MyCode : REKENMACHINE_I, MyData ADD $6, $3, $4 SUB $7, $3, $4 ADD $6, $6, $3 COPY $8, $6 # Hier begint het programma # register 6 wordt register 3 + register 4 # register 7 wordt register 3 - register 4 # register 6 wordt register 6 + register 3 # register 8 krijgt waarde van register 6 # register 3 krijgt waarde 7 # register 4 krijgt waarde 5 Klik op Compile. Het programma, dat uit vier instructies bestaat, wordt vertaald naar machinetaal. Een groen vinkje verschijnt als de programmacode syntactisch correct is. Alle initiële waarden (waarden die de simulator aanneemt na laden van de schakeling) zijn ‘1’. Een getal in één van de 16-bits registers wordt weergegeven in hexadecimale code als: FFFF. Het Instruction Memory is 14 bits. Daarom is de beginwaarde van elke geheugenplaats hier 3FFF. Klik op de rode pijl: . Er gebeuren drie dingen: ♦ De machinecode wordt geladen in het Instruction Memory. De drie vertaalde instructies van het programma staan op de eerste drie geheugenplaatsen als 0346, 1347 en 3068 in hexadecimale code. ♦ ♦ Register 3 en register 4 zijn geladen met de getallen 7 respectievelijk 5. De eerste instructie in de Program Editor licht op. 3 Klik op de goudbruine pijl: . De eerste instructie wordt hierdoor uitgevoerd. Kijk naar het Window dat de registers weergeeft en ga na of het resultaat van de eerste berekening in het juiste register staat (CHex = 12Dec). Klik nogmaals op de goudbruine pijl. Figuur 1 geeft de toestand van de machine weer na het uitvoeren van de tweede instructie. Figuur 1: Toestand van de machine na executie van de instructie SUB $7, $3, $4. Beantwoord de volgende vragen: Er zijn twee instructies uitgevoerd. Waarom is de waarde van de Program Counter 1? Antwoord: ………. Staat in het Instruction Memory de code 1347 op geheugenplaats 1? Antwoord: …….. Wat betekenen de cijfers 1, 3, 4 en 7 van deze code? Antwoorden: 1 = ……… 3 = ……… 4 =………. 7 = ……… Wat is de waarde van S1 en van S0? Antwoord ……. Bij welke operator uit tabel 1 behoren deze waarden? Antwoord: …… Staat het resultaat van de berekening in het juiste register? Antwoord: …… Verander via de optie ‘Settings’ het Number Format naar Binary en daarna naar Decimal. Voer de laatste instructies uit van het programma en controleer het resultaat. Klik nogmaals op de rode pijl. Alle componenten nemen hierdoor weer hun initiële waarden aan. Klik . Vul in het invoerveld ‘4’ in. De vier instructies van het programma worden nu in op de gele pijl: één keer uitgevoerd. Opdracht 2: Programma dat vier getallen optelt Schrijf een programma dat vier getallen, die zijn opgeslagen in de registers 1 tot en met 4 optelt. Het resultaat moet terechtkomen in register 5. De getallen in de registers 1 tot en met 4 mogen door het programma niet worden gewijzigd. Save het programma ‘DemoProgram.wasm’ onder de naam ‘Opdracht2’ door gebruik te maken van de Save As-optie en pas het ‘oude programma’ aan. 4 2. Wat gebeurt er precies als een “loopje” wordt uitgevoerd? (6 min) Instructies voor het nemen van besluiten: Branch instructies Als voorbeeld beschouwen we de instructie “Branch if Equal” BEQ. Deze instructie wordt gebruikt om de Program Counter (PC) naar een ander adres van het Instruction Memory te laten ‘springen’ als de inhoud van de registers rs en rt aan elkaar gelijk is. In dat geval wordt de uitgang ‘z’ (zero) van de ALU ‘1’. De syntax is: BEQ rs, rt, label. Voorbeeld: BEQ $2, $3, label. Betekenis: if ( register2 = register3 ) goto label. Welke operatie moet de ALU bij de instructie BEQ uitvoeren? Antwoord……… Opm. Branch-instructies laten de PC springen naar een relatief adres, bijvoorbeeld vijf plaatsen terug t.o.v. de huidige waarde van de PC. Mnemonic Betekenis Voorbeeld Betekenis ADD rd, rs, rt SUB rd, rs, rt AND rd, rs, rt MOVE rd, rt ADDI rd, rs, imm SUBI rd, rs, imm ANDI rd, rs, rt Optellen registers Aftrekken registers Bitwise AND registers Copy register Optellen register en constante Aftrekken register en const. Bitwise AND register en constante Laad getal in register Branch if rt = 0 Branch if rs = rt Branch always ADD $5, $6, $7 SUB $5, $6, $7 AND $5, $6, $7 MOVE $3, $2 ADDI $5, $6, 0x1234 SUBI $7, $6, 0x1234 ANDI $5, $6, 0d34 r5 r5 r5 r3 r5 r7 r5 LOADI $1, 0x 0020 BZ $6, end BEQ $6, $8, loop BRA label r1 0x0020 If (r6 = 0 ) goto ‘end’ If (r6 = r8 ) goto ‘loop’ PC PC + offset LOADI rd, imm BZ rt, offset BEQ rs, rt, offset BRA offset r6 + r7 r6 – r7 r6 & r7 r2 r6 + 0x1234 r6 – 0x1234 r6 & 0d34 Tabel 3 Uitbreiding instructieset met BZ (Branch Zero), BEQ en BRA (Branch Always). 5 Figuur 2: Toestand van de machine na de instructie BRA loop Om te bepalen waar de PC naar toe springt, is een optelschakeling, ADD genoemd toegevoegd. De optelschakeling is nodig om het nieuwe adres van het instructiegeheugen te berekenen. Dit adres is de som van het huidige adres en de “offset” die in het instructiegeheugen is opgeslagen. Voorbeeld: stel de waarde van de PC is 5. Zodra de z-vlag ‘1’ is moet ‘teruggesprongen’ worden naar adres 2. De offset moet in dat geval -3 (FFFD) zijn. @include "CalculatorWithLoops.wasm" .code MyCode : HARVARD, REGISTERS Opdracht 3: Calculator with loops Open met de executer uit de folder # Vermenigvuldiging: 4*8 “CalculatorWithLoops” de file LOADI $6, 4 “CalculatorWithLoops.sim-pl-ws” LOADI $0, 0 # (tussen)resultaat Laad in de Program Editor de file: Opdracht3.wasm. Compile, Load en Run dit programma. loop: ADDI $0, $0, 8 Ga in het Time Sequence Diagram na wanneer de SUBI $6, $6, 1 Program Counter naar een ander adres, dan het BZ $6, end eerstvolgende, springt. BRA loop Hoeveel clockcycles heeft het programma nodig om de vermenigvuldiging uit te voeren? Antwoord ….. end: HALT Figuur 3 Time Sequence diagram behorende bij Opdracht3.wasm 6 Opdracht 4: Gebruik de “Save AS”-optie om de filename te wijzigen in Opdracht4.wasm. Het programma moet 9 met 5 vermenigvuldigen. Gebruik BEQ (Branch if Equal) i.p.v. BZ. Maak gebruik van slechts drie registers. 3. Wat gebeurt er in een Pipeline Processor ( 6 min ) Figuur 3: Mips pipeline machine In figuur 3 is een 5-stage pipeline afgebeeld. De eerste instructie van het hiernaast weergegeven programma is: LI $1, 0x2. De donkergrijze lijn geeft het datapad van het argument “0x02” aan. De lichtgrijze lijn die van het argument “$1”. Opdracht 5: Mips Pipeline Machine Start de executer. Laad de worksheet: Componenten/Pipelined/MipsNIOC.sim-pl-ws. Open het programma: Opdracht5.wasm. Compileer, laad en executeer dit programma. Vragen: Hoeveel klokpulsen zijn er nodig om dit programma uit te voeren? Antwoord …. Waarom komt niet het goede getal in register 5 terecht? Antwoord …. Pas het programma aan zodat het goede getal wel in register 5 terecht komt. @include "Mips.wasm" .code MyCode: MIPS LI $1, 0x2 # LI is Load Immediate NOP # No operation LI $3, 0x6 NOP ADDI $5, $3, 0x9 NOP NOP