Die Bonsai-Maschinensprache
Zielsetzung
Ziel ist es, die beiden folgenden Aufgaben für den Bonsai-Modellrechner zu lösen:
- die Codierung der Assembler-Befehle
- die Zusammenführung von Programm und Daten im Speicher
Zur Verdeutlichung betrachten wir das folgende Assemblerprogramm
0 jmp 3 1 inc 0 2 dec 1 3 tst 1 4 jmp 1 5 hlt
und die folgende Speicherbelegung:
0: 3 1: 2
Codierung der Befehle
In einem realen Rechner werden die zu verarbeitenden Befehle binär codiert.
Wir orientieren uns hier zunächst am bisher betrachteten Speichermodell: Der Speicher besteht aus Registern, in die natürliche Zahlen abgelegt werden können. Bei der Codierung der Befehle verwenden wir daher (vorerst) auch natürliche Zahlen.
inc ... → 1 ... dec ... → 2 ... jmp ... → 3 ... tst ... → 4 ... hlt ... → 5 ...
Beachte, dass es sich hier um eine zweckmäßige, aber auch willkürliche Festlegung handelt.
Ein Bonsai-Assemblerbefehl setzt sich aus einem Operationsteil und einem
Adressteil zusammen. So besteht etwa der Befehl jmp 1
aus der
Operation jmp
und der Adresse 1
.
jmp 1 | | 3 0001
Bei der Codierung eines Bonsai-Assemblerbefehls wird der Operationsteil durch den oben gezeigten Code ersetzt.
Die Adresse wird hier als 4-stellige Zahl geschrieben. Für den Befehl jmp 1
ergibt sich so der
Code 30001
.
Beachte, dass die Zweiteilung in einen Operationsteil und einen Adressteil auch bei codierten Befehlen gegeben ist. An der ersten Stelle des Codes kann man nach wie vor den Befehl ablesen.
Zusammenführung von Programm und Daten im Speicher
Wenn man das gesamte oben gezeigte Assemblerprogramm codiert, dann ergibt sich ein neues Problem.
0: 30003 1: 10000 2: 20001 3: 40001 4: 30001 5: 50000
Der inc-Befehl 10000
bezieht sich auf ein Register, in dem nicht das zu verarbeitende Datum steht,
sondern ein Teil des Programms selbst.
Die zu verarbeitenden Daten müssen also in anderen Registern gespeichert werden (z.B. in den Registern 7 und 8). Die Adressteile der Befehle inc, dec und tst müssen dann natürlich entsprechend angepasst werden.
0: 30003 1: 10007 2: 20008 3: 40008 4: 30001 5: 50000 6: 7: 00003 8: 00002
Bei dieser Codierung beginnt das codierte Programm in Speicherzelle 0. Möglich ist es auch, das Programm an einer anderen Speicherzelle beginnen zu lassen. Hier muss dann mit einem geeigneten Sprungbefehl der Programmbeginn erreicht werden, da die Programmausführung - typischerweise für eine CPU - nach einem Reset immer an der Stelle 0 beginnt.
0: 30003 ... 3: 30006 4: 10011 5: 20012 6: 40012 7: 30004 8: 50000 ... 11: 00003 12: 00002
Aufgabe 1
Gegeben ist das folgende Programm und die zu verarbeitenden Daten. Entwickle ein passende Speicherbelegung für Programm und Daten.
Programm:
0 tst 1 1 jmp 3 2 jmp 6 3 dec 1 4 inc 0 5 jmp 0 6 hlt
Daten:
0: 3 1: 2