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
X

Fehler melden

X

Suche