Erzeugung von Komfort-Assembler-Code
Übersetzungsschablonen
Bei der Erzeugung von Assembler-Code hat es sich bewährt, für immer wiederkehrende Verarbeitungsaufgaben Übersetzungsschablonen in Form von Code-Schnipseln zu erzeugen, die dann modular als Bausteine beim Übersetzen von MiniPython-Programmen verwendet werden könn. Diese Vorgehensweise soll an einem Beispiel erläutert werden.
Beispiel: Zuweisungen vom Typ a = a + b
Wir setzen hier voraus, dass a und b verschiedene Variablen sind.
Die Idee zur Umsetzung solcher Zuweisungen lässt sich informell so beschreiben:
{a: III; b: IIII} eine Hilfsvariable h erzeugen {a: III; b: IIII; h: } transportiere den Inhalt von Register b in Register a und das Hilfsregister h {a: IIIIIII; b: ; h: IIII} transportiere den Inhalt von Register h zurück in Register b {a: IIIIIII; b: IIII; h: }
In Kurzform läst sich das so beschreiben:
# c_zuw_a_gleich_a_plus_b # Parameter: a, b # Hilfsvariable: h b -> a, h h -> b
Der zugehörige Komfort-Assembler-Code sieht dann so aus.
# c_zuw_a_gleich_a_plus_b
# Parameter: a, b
# Hilfsvariable: h
# b -> a, h
tst b
jmp (+2)
jmp (+5)
dec b
inc a
inc h
jmp (-6)
# h -> b
tst h
jmp (+2)
jmp (+4)
dec h
inc b
jmp (-5)
Dieses Code-Schnipsel lässt sich jetzt immer in Zuweisungssituationen vom Typ a = a + b
verwenden,
z.B. bei der Zuweisung p = p + x
.
# c_zuw_a_gleich_a_plus_b
# Parameter: p, x
# Hilfsvariable: _h0
# x -> p, _h0
tst x
jmp (+2)
jmp (+5)
dec x
inc p
inc _h0
jmp (-6)
# _h0 -> x
tst _h0
jmp (+2)
jmp (+4)
dec _h0
inc x
jmp (-5)
Aufgabe 1
Teste den Komfort-Assembler-Code für Zuweisungen vom Typ a = a + b
.
Aufgabe 2
Entwickle (ggf. arbeitsteilig im Team) weitere Übersetzungsschablonen. Ideen hierzu werden in den Unterabschnitten vorgestellt.
Aufgabe 3
Verwende Übersetzungsschablonen bzw. passende Code-Schnipsel, um ein Komfort-Assemblerprogramm zu folgenden MiniPython-Programmen systematisch zu erzeugen.
Programm 1 (einfach)
x = 4
y = 0
i = 0
while i < x:
y = y + 2
i = i + 1
#end
Programm 2 (schwierig)
x = 9
y = 6
while x != y:
if x <= y:
y = y - x
else:
x = x - y
#end
#end