E10 Hoe werkt een computer nu precies?

advertisement
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
Download