Zuweisungen
a = n
Hier muss zunächst dafür gesorgt werden, dass der Inhalt von Register a geleert wird. Anschließend wird n mal (n eine natürliche Zahl) Register a inkrementiert.
# c_zuw_a_gleich_n
# Parameter: a
# Hilfsvariable:
# a = 0
tst a
jmp (+2)
jmp (+3)
dec a
jmp (-4)
# n mal inc a
inc a
...
inc a
Teste das Code-Schnipsel.
a = b
Die Übersetzung solcher Zuweisungen könnte nach folgendem Verfahren ablaufen.
{a: III; b: IIII} eine Hilfsvariable h erzeugen {a: III; b: IIII; h: } Register a leeren {a: ; b: IIII; h: } transportiere den Inhalt von Register b in Register a und das Hilfsregister h {a: IIII; b: ; h: IIII} transportiere den Inhalt von Register h zurück in Register b {a: IIII; b: IIII; h: }
Erzeuge das zugehörige Code-Schnipsel und teste es.
a = b + n
Ergänze die Verfahrensbeschreibung und erzeuge das zugehörige Code-Schnipsel.
{a: III; b: IIII} eine Hilfsvariable h erzeugen {a: III; b: IIII; h: } Register a leeren {a: ; b: IIII; h: } transportiere den Inhalt von Register b in Register a und das Hilfsregister h {a: IIII; b: ; h: IIII} transportiere den Inhalt von Register h zurück in Register b {a: IIII; b: IIII; h: } inkrementiere Register a n-mal {a: IIIII...I; b: IIII; h: }
a = b - n
Gehe analog zum Fall a = b + n vor.
a = b + c
Dieser Fall soll ganz allgemein gelöst werden. Es soll also auch zulässig sein, dass alle vorkommenden Variablen gleich sind: a = a + a.
Benutze folgende Idee: Erzeuge Hilfsvariablen h_b für b und h_c für c. Kopiere b nach h_b und c nach h_c. Leere den Inhalt von a. Transportiere den Inhalt von h_b und von h_c nach a.
Entwickle ein passendes Code-Schnipsel und teste es gründlich.
a = b - c
Gehe analog zum Fall a = b + c vor.