Bislang wurden die Kernelemente von JASm Core sowie einige hilfreiche Sprachelemente vorgestellt. Dies wurde an zweckdienlichen Beispielen präsentiert, doch noch steht unter anderem auch noch der Nachweis aus, dass die zwei Befehle SUB und JA tatsächlich ausreichend sind, um komplexere Aufgaben zu bewältigen.
In diesem Beitrag sollen nun einige weitergehende Codebeispiele dargestellt werden. Die Beispiele bauen in vielen Fällen aufeinander auf und nehmen so in ihrer Komplexität jeweils zu. Es ist auch in einigen Fällen nicht immer der effizienteste Lösungsansatz gewählt worden, da es hier immer noch um die Vermittlung der Sprache geht.
Sprünge
Zunächst einmal soll die Möglichkeit von unbedingten Sprüngen im Programm dargestellt werden. Mit dem JA Befehl existiert bereits ein bedingter Sprung (Bedingung: Wert größer als null). Für den unbedingten Sprung bieten sich unter anderem die beiden folgenden Optionen an.
Unbedingter Sprung – absolut
Der unbedingte Sprung an eine andere Stelle im Programm lässt sich recht einfach bewerkstelligen. Hierzu wird die Tatsache ausgenutzt, dass die Speicherstelle 0, die den Programmzeiger beinhaltet, nie 0 oder negativ sein kann, außer in dem Moment, wo das Programm kontrolliert enden soll.
Aus diesem Grund kann mit dem Sprungbefehl JA eine einfache Überprüfung eben dieser Adresse vorgenommen werden, die in jedem Fall positiv verläuft und damit einen Sprung an die angegebene Zieladresse veranlasst werden.
JA 0 @a
Hierdurch erfolgt in jedem Fall ein Sprung zur Speicherzelle a, da der Wert der Zelle 0 immer positiv (also größer null) ist.
@Start # Initialisierung des Programmzeigers Step: -3 # Schrittweite des Programmzeigers Start: JA 0 @Start # Endlosschleife
Dieses Beispiel realisiert die kürzeste Form einer Endlosschleife. Nach Austausch der Textmarken durch den Interpreter lautet der Code wie folgt:
Adresse(n) | Inhalt | Erläuterung |
0 | 2 | Initialisierung des Programmzeigers |
1 | -3 | Schrittweite des Programmzeigers |
2-4 | JA 0 2 | Endlosschleife |
Unbedingter Sprung – relativ
Eine andere Möglichkeit stellt die Manipulation des Programmzeigers durch den SUB Befehl dar. Hierdurch lassen sich relative Sprünge abbilden, also nicht der Sprung auf eine dedizierte Adresse, sondern um eine relative Distanz.
@Start # Initialisierung des Programmzeigers Step: -3 # Schrittweite des Programmzeigers three: 3 # Konstante three, belegt mit 3 Start: SUB 0 @three # Endlosschleife
Auch dieses Programm stellt eine Endlosschleife dar, bei der der Programmzeiger, der vor der Ausführung des Befehls in der Maschine um drei erhöht wird, durch den Befehl selber um diese drei wieder reduziert wird und damit wieder auf den SUB Befehl zeigt.
Nach Übersetzung der Textmarken sieht das Programm wie folgt aus:
Adresse(n) | Inhalt | Erläuterung |
0 | 3 | Initialisierung des Programmzeigers |
1 | -3 | Schrittweite des Programmzeigers |
2 | 3 | Konstante three, belegt mit 3 |
3-5 | SUB 0 2 | Endlosschleife |
Addition
Als Rechenoperator kam bislang lediglich die JASm-eigene Subtraktion SUB zum Einsatz. In diesem Beispiel soll nun gezeigt werden, wie eine Addition realisiert werden kann. Hierbei wird die Addition von Werten wird durch doppelte Subtraktion realisiert, da folgendes gilt:
a+b = a-(-b)
Der Quellcode lautet in JASm entsprechend
SUB @c @b SUB @a @c
Als vollwertiges Programm bei dem die Summe von 10 und 5 ermittelt wird, sieht der Quellcode dann wie folgt aus:
@Start # Initialisierung des Programmzeigers Step: -3 # Schrittweite des Programmzeigers REM Variablendefinition a: 10 # Wert für a, hier: 10 b: 5 # Wert für b, hier: 5 c: 0 # Wert für c, initialisiert mit 0 REM Additionsroutine Start: SUB @c @b # c = c - b SUB @a @c # a = a - c SUB 0 0 # Programm beenden
Das Ergebnis der Addition befindet sich dann in der Zelle 1 (@a). Die Variable c dient hier nur als temporäre Variable um das Vorzeichen von b umzukehren.
Der Interpreter wird den mit Adressen versehenen Code wie folgt übersetzen:
Adresse(n) | Inhalt | Erläuterung |
0 | 5 | Initialisierung des Programmzeigers |
1 | -3 | Schrittweite des Programmzeigers |
2 | 10 | Wert für a, hier: 10 |
3 | 5 | Wert für b, hier: 5 |
4 | 0 | Wert für c, initialisiert mit 0 |
5-7 | SUB 4 3 | c = c – b |
8-10 | SUB 2 4 | a = a – c |
11-13 | SUB 0 0 | Programm beenden |