JASm Core
JASm kommt mit zwei Maschinenbefehlen aus, die in diesem Abschnitt näher erläutert werden. Generell werden für jeden Maschinenbefehl drei aufeinanderfolgende Speicherzellen benötigt, wobei die erste Speicherzelle den eigentlichen Befehl und die folgenden beiden Speicherzellen Speicheradressen mit den Parametern beinhalten.
Subtraktion (SUB, S oder 0)
Der Subtraktionsbefehl SUB (oder kürzer “S”, bzw. im Binärcode 0) bildet die Differenz von zwei durch ihre Speicheradressen angegebenen Werten und speichert das Ergebnis in die erste der angegebenen Speicherzellen. Das Kommando lautet somit
SUB a b
wobei a und b Speicheradressen sind. In klassischer Syntax vollführt die Maschine mit diesem Befehl die folgende Instruktion:
$a = $a - $b
Der Inhalt der ersten Speicherzelle (a) wird um den Wert der zweiten Speicherzelle (b) reduziert.
Standardmäßig wird der textuelle SUB Befehl als 0 interpretiert. Bei der Ausführung des Programms wird allerdings jeder Wert kleiner oder gleich 0 als SUB Befehl verstanden. Dies hat den Vorteil, dass bei einem Sprung auf einen leeren Speicherbereich das Programm automatisch terminiert. Näheres hierzu folgt in der Beschreibung der JASm Maschine.
Vor der Ausführung dieses Befehls wird der Programmzeiger durch die JASm-Maschine um drei Speicherzellen erhöht, sodass das Programm in der Regel linear mit dem nächsten Befehl fortgeführt wird. Da mit diesem Befehl allerdings auch der Programmzeiger selber modifiziert werden kann, können so auch unbedingte Sprünge (SUB 0 a) und des gezielte Programmende (SUB 0 0) realisiert werden.
Bedingter Sprung (JA, J oder 1)
Der bedingte Sprung JA (für “Jump if Above zero”, bzw. kürzer “J” und im Binärcode 1) prüft, ob ein gegebener Zellinhalt größer als 0 ist. Im positiven Fall erfolgt ein Sprung in der Programmausführung an die als zweiter Parameter angegebene Adresse im Speicher. Im anderen Fall, wenn der zu prüfende Wert kleiner oder gleich 0 ist, folgt die Programmausführung mit dem sequentiell nächsten Befehl, also drei Speicherzellen voraus.
Das Kommando lautet somit wie folgt
JA a b
wobei a und b Speicheradressen sind. In klassischer Syntax vollführt die Maschine mit diesem Befehl die folgende Instruktion:
if ($a > 0) goto b;
Es ist dabei zu beachten, dass für den Vergleich der Inhalt der Speicherzelle a ausgewertet wird, der Sprung erfolgt allerdings zur Adresse b (nicht zur in der Speicherzelle b angegebenen Adresse).
Ein Beispiel:
2 # Programmzeiger -3 # Schrittweiter für den Programmzeiger JA 5 2 # Sprungbefehl mit Verweis auf den Inhalt der Zelle 4 und Zielzelle 1 10 # Wert 10
Im Arbeitsspeicher sieht das Programm dann wie folgt aus
Adresse | Inhalt | Kommentar |
0 | 2 | Programmzeiger |
1 | -3 | Schrittweite für den Programmzeiger |
2 | 1 (= JA) | # Sprungbefehl |
3 | 5 | # erster Parameter mit Verweis auf den Inhalt der Zelle 5 |
4 | 2 | # zweiter Parameter mit Verweis auf Zelle 2 |
5 | 10 | # Datum |
Hierbei handelt es sich um eine Endlosschleife. Der Programmzeiger (Adresse 0) verweist auf Zelle 2. Dort ist der JA Operator. Sein erster Parameter in Zelle 3 beinhaltet eine 5, die auf den Inhalt der Zelle 5 verweist. Dieser Wert (10) ist größer als 0, daher wird für die Programmausführung nun gemäß zweitem Parameter (Zelle 3) die Adresse 2 angesprungen und damit der JA Vergleich erneut durchgeführt.
Wollte man das Sprungziel zur Laufzeit verändern, müsste der Inhalt der Zelle 4 (hier: 2) modifiziert werden.
Standardmäßig wird der textuelle JA Befehl als 1 interpretiert. Bei der Ausführung des Programms wird allerdings jeder Wert größer als 0 als JA Befehl verstanden.
JASm Core Syntax
Durch die absolut minimalistische Codierung kann der JASm Interpreter, bzw. Compiler sehr robust implementiert werden.
<Whitespaces> <Mnemonic> [<Whitespace> <Value> [<Whitespace> <Value>]] <Rest>
mit
- <Whitespace>
ist eine Anzahl an Leerzeichen, Zeilenwechsel oder Tabulatoren größer 0 - <Whitespaces>
ist eine beliebige Anzahl an Leerzeichen, Zeilenwechsel oder Tabulatoren, also auch 0 - <Mnemonic>
ist eins aus J, JA, S oder SUB, wobei zwischen Groß- und Kleinbuchstaben nicht unterschieden wird - <Value>
ist eine beliebige Anzahl an Ziffern - <Rest>
ist eine beliebige Anzahl an Leerzeichen und Tabulatoren oder einem #, bzw. // gefolgt von beliebigen Zeichen (außer Zeilen- und Dateienden). Die Sequenz endet mit einem Zeilen- oder Dateiende.