Station - Abarbeitung von Programmen

Eine Speichereinheit

Im Register des sog. Programmzählers soll die Adresse des nächsten auszuführenden Befehls zwischengespeichert werden.

Programmzähler

Lade zur Simulation dieses Systems die Datei registermaschine.txt herunter und benenne sie in registermaschine.py um.

Aufgabe 1

(a) Führe das folgende Testprogramm aus. Beachte, dass das importierte Modul registermaschine.py im selben Verzeichnis wie das Testprogramm abgespeichert ist.

from registermaschine import *

# Erzeugung der Busse
dbus = Bus()
abus = Bus()

# Erzeugung der ALU
alu = ALU_incdec()

# Erzeugung des Speichers
speicher = Speicher([2004, 1005, 1006, 5000, 3, 1, 1])

# Erzeugung des Befehlsregisters
ir = Befehlsregister()

# Erzeugung des Programmzählers
pc = Programmzaehler()

# Erzeugung der Tore
tor3 = Tor(speicher, dbus, "write")
tor4 = Tor(speicher, dbus, "read")
tor16 = Tor(speicher.regAdresse, abus, "read")
tor16.oeffnen()

tor7 = Tor(alu.akku, dbus, "read")
tor8 = Tor(alu.akku, dbus, "write")

tor11 = Tor(ir.regIR, dbus, "read")
tor12 = Tor(ir, abus, "write")

tor9 = Tor(pc.regPC, abus, "read")
tor10 = Tor(pc.regPC, abus, "write")

# Ausgabe der Registerinhalte
for i in [0, 1, 2, 3, 4, 5, 6]:
    print(i, ":", speicher.register[i].wert)

# Initialisierung des Programmzählers
pc.initPC(0)

# dec-Befehl in IR holen
tor10.oeffnen()
tor3.oeffnen()
tor11.oeffnen()
tor11.schliessen()
tor3.schliessen()
tor10.schliessen()

# dec-Befehl ausführen
tor12.oeffnen()
tor3.oeffnen()
tor7.oeffnen()
tor7.schliessen()
tor3.schliessen()
alu.dec()
tor8.oeffnen()
tor4.oeffnen()
tor4.schliessen()
tor8.schliessen()
tor12.schliessen()

# Aktualisierung des Programmzählers
pc.incPC()

# Ausgabe der Registerinhalte
for i in [0, 1, 2, 3, 4, 5, 6]:
    print(i, ":", speicher.register[i].wert)

(b) Analysiere das Testprogramm. Beschreibe, was in den einzelnen Schritten hier abläuft.

(c) Ergänze das Testprogramm so, dass das gesamte im Speicher abgelegte Registermaschinenprogramm ausgeführt wird.

Aufgabe 2

Das folgende Testprogramm zeigt, wie man einen TST-Befehl ausführt.

from registermaschine import *

# Erzeugung der Busse
dbus = Bus()
abus = Bus()

# Erzeugung der ALU
alu = ALU_incdec()

# Erzeugung des Speichers
speicher = Speicher([4004, 1005, 1006, 5000, 3])

# Erzeugung des Befehlsregisters
ir = Befehlsregister()

# Erzeugung des Programmzählers
pc = Programmzaehler()

# Erzeugung der Tore
tor3 = Tor(speicher, dbus, "write")
tor4 = Tor(speicher, dbus, "read")
tor16 = Tor(speicher.regAdresse, abus, "read")
tor16.oeffnen()

tor7 = Tor(alu.akku, dbus, "read")
tor8 = Tor(alu.akku, dbus, "write")

tor11 = Tor(ir.regIR, dbus, "read")
tor12 = Tor(ir, abus, "write")

tor9 = Tor(pc.regPC, abus, "read")
tor10 = Tor(pc.regPC, abus, "write")

# Initialisierung des Programmzählers
pc.initPC(0)

# Ausgabe des Programmzählers
print("PC:", pc.regPC.wert)

# Befehl in IR holen
tor10.oeffnen()
tor3.oeffnen()
tor11.oeffnen()
tor11.schliessen()
tor3.schliessen()
tor10.schliessen()

# tst-Befehl ausführen
tor12.oeffnen()
tor3.oeffnen()
pc.incPCz(dbus)
tor3.schliessen()
tor12.schliessen()
pc.incPC()

# Ausgabe des Programmzählers
print("PC:", pc.regPC.wert)

(a) Analysiere und erkläre die Vorgehensweise.

(b) Entwickle selbst ein Verfahren zur Ausführung eines JMP-Befehls (das ist recht einfach). Entwickle auch ein passendes Testverfahren.

Aufgabe 3

Die Abarbeitung eines gesamten Programms lässt sich wie folgt realisieren:

from registermaschine import *

# Erzeugung der Busse
dbus = Bus()
abus = Bus()

# Erzeugung der ALU
alu = ALU_incdec()

# Erzeugung des Speichers
programm = [4008, 3003, 3006, 2008, 1007, 3000, 5000, 5, 3]
speicher = Speicher(programm)

# Erzeugung des Befehlsregisters
ir = Befehlsregister()

# Erzeugung des Programmzählers
pc = Programmzaehler()

# Erzeugung der Tore
tor3 = Tor(speicher, dbus, "write")
tor4 = Tor(speicher, dbus, "read")
tor16 = Tor(speicher.regAdresse, abus, "read")
tor16.oeffnen()

tor7 = Tor(alu.akku, dbus, "read")
tor8 = Tor(alu.akku, dbus, "write")

tor11 = Tor(ir.regIR, dbus, "read")
tor12 = Tor(ir, abus, "write")

tor9 = Tor(pc.regPC, abus, "read")
tor10 = Tor(pc.regPC, abus, "write")

# Ausgabe der Registerinhalte
for i in range(len(programm)):
    print(i, ":", speicher.register[i].wert)

# Initialisierung des Programmzählers
pc.initPC(0)

# Abarbeitung des Befehlszyklus

while True:
    # Befehl in IR holen
    tor10.oeffnen()
    tor3.oeffnen()
    tor11.oeffnen()
    tor11.schliessen()
    tor3.schliessen()
    tor10.schliessen()
    # Befehl decodieren und ausführen
    op = ir.op()
    if op == 1:
        tor12.oeffnen()
        tor3.oeffnen()
        tor7.oeffnen()
        tor7.schliessen()
        tor3.schliessen()
        alu.inc()
        tor8.oeffnen()
        tor4.oeffnen()
        tor4.schliessen()
        tor8.schliessen()
        tor12.schliessen()
        pc.incPC()
    elif op == 2:
        # ...
    elif op == 3:
        # ..
    elif op == 4:
        # ...
    elif op == 5:
        break

# Ausgabe der Registerinhalte
for i in range(len(programm)):
    print(i, ":", speicher.register[i].wert)

(a) Ergänze die fehlenden Teile.

(b) Teste das Simulationsprogramm auch mit anderen Registermaschinenprogrammen.

Software-Bausteine zur Simulation eines Programmzählers

Das Klassendiagramm beschreibt die Struktur der Software-Bausteine zur Simulation eines Programmzählers.

Programmzähler

Ein Programmzaehler-Objekt verwaltet mit dem Attribut regPC ein Register-Objekt, in dem der nächste abzuarbeitende Befehl zwischengespeichert wird. Zur Initialisierung und Veränderung des Registerwerts verfügt ein Programmzähler-Objekt über die Operationen initPC, incPC und incPCz. Die Operation incPC() erhöht den Wert des Registers regPC um 1. Die Operation incPCz(dbus) erhöht den Wert des Registers regPC nur dann um 1, wenn der Wert des Datenbusses dbus gleich 0 ist.

X

Fehler melden

X

Suche