Lernpfad Know-How-Computer/KHC-Maschinensprache - erste Schritte Teil 2
- In diesem Kapitel lernst du an einem weiteren Programmbeispiel die Befehle
dec x,jmp xundisz xkennen. - Zusammen mit den beiden Befehlen aus dem vorangegangenen Kapitel verfügst du damit auch schon über sämtliche Befehle, die zur Maschinensprache des Know-How-Computer gehören.
- Im Zusammenhang mit der Programmierung von Schleifen erfährst du auch, wie eine Endlosschleife entsteht, was ein Laufzeitfehler ist und wie ein Programmablaufplan dafür sorgen kann, dass man den Überblick behält.
- Am Ende dieser Seite findest du eine Kurzübersicht über alle fünf KHC-Befehle.
Zweites Programmbeispiel "Von x auf 0"
Was soll das Programm tun?
Bei diesem Programm gehen wir davon aus, dass vor dem Programmstart in Zelle 6 ein beliebiger Wert steht, z.B. der Wert 3. Das Programm soll nun dafür sorgen, dass in dieser Zelle nach dem Programmende der Wert 0 steht.
Allerdings besteht die Lösung der gestellten Aufgabe nicht darin, einfach den Befehl dec 6 dreimal hintereinander in den Hauptspeicher zu schreiben, denn damit würde das Programm ausschließlich für den Anfangswert 3 in Zelle 6 korrekt arbeiten. Es soll aber für beliebige Startwerte funktionieren. Egal, welcher Wert zu Beginn in Zelle 6 steht - nach dem Programmende soll dort immer der Wert 0 stehen.
"Von x auf 0" - erster Entwurf
Ein erster Programmentwurf könnte so aussehen:
1: dec 6 2: jmp 1 ... 6: 3
Anders als bei den Befehlen inc x und dec x macht der Befehl jmp x natürlich nur Sinn, wenn an der Adresse x im Speicher kein Datenwert, sondern auch wieder ein KHC-Befehl steht, der dann als nächstes ausgeführt werden kann.
Tatsächlich führt die Befehlsfolge 1: dec 6 und 2: jmp 1 erst einmal dazu, dass der Wert in Zelle 6 schrittweise von 3 auf 0 heruntergezählt wird. Mit dem dec-Befehl wird der Programmzähler um 1 auf 2 erhöht. Dort sorgt aber der jmp-Befehl dafür, dass er gleich wieder auf die Adresse 1 zurückgesetzt wird, so dass als nächstes erneut der dec-Befehl ausgeführt wird. Wir haben damit eine so genannte Schleife programmiert, die tatsächlich jeden beliebigen Wert in Zelle 6 bis auf den Wert 0 herunterzählt.
Ein Problem ist nun allerdings: Nachdem der Wert in Zelle 6 einmal den gewünschten Zielwert 0 erreicht hat, sorgt der jmp-Befehl dafür, dass der dec-Befehl trotzdem erneut ausgeführt wird. Dies führt zu einem weiteren Laufzeitfehler, denn das Verringern des Wertes 0 um 1 würde zu dem negativen Wert -1 führen, der aber als Datenwert im KHC nicht zugelassen ist.
Und ein weiteres Problem besteht darin, dass diese Schleifenkonstruktion - unabhängig von dem Laufzeitfehler - nie zu einem Ende kommen würde. Man spricht hier auch von einer Endlosschleife. Mit den bisher verfügbaren KHC-Befehlen gibt es auch keine Möglichkeit, daran etwas zu ändern, auch nicht mit dem stp-Befehl, weil dieser nicht zum richtigen Zeitpunkt erreicht werden kann. Aber zum Glück gibt es noch einen weiteren Befehl ..."Von x auf 0" - zweiter Entwurf
isz x verwenden ("is zero" bedeutet abgekürzt "ist Null"). Dieser Befehl funktioniert so:Programmablaufplan
Der Ablauf eines Programms kann auch mit einem so genannten "Programmablaufplan (PAP)" oder auch "Flussdiagramm" grafisch anschaulich dargestellt werden. Für das KHC-Programm "Von x auf 0" könnte ein solcher PAP zum Beispiel so aussehen:
- Oval
- Anfang / Ende des Programms
- Raute
- Verzweigung / Entscheidung - abhängig von der angegebenen Bedingung
- Rechteck
- Operation / Anweisung / Befehl
- Pfeil
- zeigt auf den nächsten Programmschritt
Pseudocode
Eine andere Möglichkeit, die Programmidee übersichtlich darzustellen, bietet der so genannte Pseudocode, der manchmal auch als Entwurfsprache bezeichnet wird. Für das KHC-Programm "Von x auf 0" könnte ein solcher Pseudocode zum Beispiel so aussehen:
solange nicht x = 0 wiederhole verringere x um 1 solange_ende
- inc x
- Erhöhe den Wert in Zelle x um 1 und erhöhe den Programmzähler um 1.
- dec x
- Verringere den Wert in Zelle x um 1 und erhöhe den Programmzähler um 1.
- jmp x
- Setze den Programmzähler auf den Wert x.
- isz x
- Wenn Zelle x den Wert 0 (zero) enthält, dann erhöhe den Programmzähler um 2, sonst erhöhe den Programmzähler um 1.
- stp
- Beende das Programm.
