JASm Maschine
Bei der JASm Maschine handelt es sich um einen einfachen Computer, der die beiden JASm Befehle auswerten kann. Zusätzlich hat er einen (theoretisch) unendlichen Speicher. Die weiteren Anforderungen sind äußerst überschaubar, sodass sich die Maschine sehr leicht implementieren lässt.
Speicher und Speicheradressen
Der Speicher der JASm Maschine ist theoretisch unbegrenzt und in Speicherzellen aufgeteilt. Die einzelnen Speicherzellen fassen beliebige und beliebig große Werte, wobei es sich in der Praxis um vorzeichenbehaftete ganze Zahlen handelt.
Die Adressen der Speicherzellen sind als (positive) Ganzzahlen zu betrachten und fortlaufend aufsteigend, beginnend bei 0 angelegt. Die Speicherzelle 0 hat dabei eine gesonderte Funktion als Programmzeiger. Darüber hinaus besteht auch die Möglichkeit Speicherzellen mit negativen Adressen anzusprechen, die für weitere gesonderte Funktionen wie zur Ein- und Ausgabe reserviert sind.
Der Inhalt der Speicherzellen wird mit 0 vorbelegt, so sie nicht durch den Code bereits anderweitig definiert oder genutzt wurden.
Programmzeiger
Die Speicherzelle 0 der JASm Maschine beinhaltet die Adresse des nächsten Programmschritts. Initial sollte diese Zelle mit der Adresse des ersten Befehls beinhalten. Im normalen Programmablauf wird dieser Wert bei der Ausführung eines Befehls um drei erhöht, bzw. im Falle einer positiven Prüfung im JA Befehl durch die Sprungadresse ersetzt.
Die erste Zeile des Programmcodes wird für die Zuweisung der Speicherzelle 0 genutzt, sodass der Wert der Speicherzelle 0 mindestens 1 betragen muss.
In der zweiten Zelle (Zelle 1) ist die Schrittweite für den Programmzeiger zu hinterlegen. Üblicherweise ist dies -3. Die Schrittweite gibt den Wert an, um den der Programmzähler vor jeder Operation reduziert wird. (Drei Zellen voraus entspricht einer Reduktion um -3.)
Mit JASm kann man sowohl den Programmzeiger als auch die Schrittweite des Programmzeigers manipulieren. Beides sollte allerdings mit Bedacht geschehen. Würde die Schrittweite 0 lauten, wird sich das Programm in eine Endlosschleife an der nächsten Zelle begeben. Eine Schrittweite von 3 ließe das Programm “rückwärts” laufen …
Zu bedenken ist, dass die nächste Adresse für das Programm bereits VOR der Ausführung der aktuellen Operation berechnet wird. Die Manipulation des Schrittweitenzählers würde demnach erst mit der nächsten Operation greifen.
Die Programmausführung wird korrekt terminiert, wenn der Programmzeiger in der Zelle 0 den Wert 0 annimmt, also auf sich selber zeigt.
Ein- und Ausgabe
Von sich aus kann die JASm Maschine keine Tastatureingabe einlesen oder Bildschirmausgabe produzieren. Dies lässt sich allerdings über einen eine Adressierung spezieller Speicherzellen realisieren.
So wird die fiktive Speicheradresse -1 zum Auslesen eines Zeichens von der Tastatur genutzt. Das Schreiben auf diese negative Adresse entspricht der Ausgabe einer Konsole.
SUB -1 3 # gibt den Inhalt der Speicherzelle 3 aus
Weitere negative Speicheradressen können theoretisch für andere Ein- und Ausgabegeräte genutzt werden.
Programmabbruch
Die JASm Maschine kennt keine fehlerhafte Anweisung, da jeder Wert als SUB (Wert <= 0) oder JA (>0) interpretiert werden kann und unbekannte Speicherzellen mit dem Wert 0 vorbelegt werden. Um einen geordneten Programmabbruch zu vollführen, muss der Programmzeiger auf sich selbst, also auf 0 gesetzt werden
SUB 0 0 # Programm beenden
Zugleich ist durch die Tatsache, dass ungenutzter Speicher mit 0 initialisiert wird, sichergestellt, dass bei einem Sprung an eine undefinierte Speicheradresse (Zelleninhalt: 0 0 0 = SUB 0 0) das Programm automatisch beendet wird.
Beispielprogramm
Das folgende Beispielprogramm berechnet die Differenz von 10 und 5. Das Ergebnis verbleibt dann in der Speicherzelle 7, in der sich zu Programmstart der Wert 10 befindet.
2 # Initialisierung des Programmzeigers, zeigt auf Zelle 2 -3 # Schrittweite des Programmzeigers SUB 7 8 # Subtraktion der Speicherzellen 7 und 8 SUB 0 0 # Programm beenden 10 # Wert 10 5 # Wert 5
Dieses Programm sieht im Speicher der JASm Maschine vor der Ausführung wie folgt aus:
Adresse | Inhalt | Erläuterung |
0 | 2 | Programmzeiger, Initialer Verweis auf Zelle 2 |
1 | -3 | Schrittweite des Programmzeigers |
2 | 0 | SUB |
3 | 8 | Parameter 1 für SUB |
4 | 9 | Parameter 2 für SUB |
5 | 0 | SUB |
6 | 0 | Parameter 1 für SUB |
7 | 0 | Parameter 2 für SUB |
8 | 10 | Wert, später Ergebnis |
9 | 5 | Wert |
Laufzeitumgebung
Eine in JavaScript implementierte JASm Maschine findet sich im vierten Beitrag dieser Reihe.
Und weiter?
Damit ist das wichtigste zu JASm beschrieben. Allerdings ist das Programmieren auf dieser Ebene noch äußerst umständlich, sodass im nächsten Beitrag noch ein paar Sprachkonstrukte wie Kommentare, Adressbezeichner und ASCII Konvertierungen eingeführt werden. Diese Elemente werden durch einen Interpreter/Compiler in JASm Core Code umgewandelt, sodass sich für die JASm Maschine und den JASm Core Code hieraus keinerlei Änderungen mehr ergeben.