i

Bedingungen

Vorbemerkung

Das Ergebnis bei der Auswertung einer Bedingung ist einer der beiden Wahrheitswerte True und False. Dieses Ergebnis wird in ein Hilfsregister abgelegt und mit einer Hilfsvariablen zugänglich gemacht. Zur Codierung der Wahrheitswerte benutzen wir die Zuordnung True -> 1 und False -> 0.

a == 0

Die Übersetzung dieser Bedingung ist recht einfach. Zu beachten ist nur, dass die Hilfsvariable h zunächst auf einen festen Anfangswert (hier: 0) initialisiert wird.

# c_bed_a_gleich_null
# Parameter: a
# Hilfsvariable: h
# h = 0
tst h
jmp (+2)
jmp (+3)
dec h
jmp (-4)
# a == 0?
tst a
jmp (+2)
inc h

Teste das Code-Schnipsel.

a != 0

Ändere das Code-schnipsel für a == 0 geeignet an.

a == b

Hier könnte man so vorgehen:

{a: III; b: IIIII; h: ...}
eine weitere Hilfsvariable h_c erzeugen
{a: III; b: IIIII; h: ...; h_c: }
Register h ggf. leeren
{a: III; b: IIIII; h:  ; h_c: }
Register a und Register b abbauen und Register h_c aufbauen bis mindestens eines leer ist
{a:  ; b: II; h: ; h_c: III}
testen, ob a und b leer ist; ggf. h inkrementieren
{a:  ; b: II; h: ; h_c: III}
transportiere den Inhalt von Register h_c zurück in Register a und Register b
{a: III; b: IIIII; h:  ; h_c: }

Eine Umsetzung dieser Idee könnte so aussehen:

# c_bed_a_gleich_b
# Parameter: a, b
# Hilfsvariablen: h, h_c
# h = 0
tst h
jmp (+2)
jmp (+3)
dec h
jmp (-4)
# teste a und b 
tst a
jmp (+4)
tst b
jmp (+10)
jmp (+8)
tst b 
jmp (+2)
jmp (+6)
# a != 0 & b != 0: a, b abbauen, h_c aufbauen
dec a
dec b
inc h_c
jmp (-11)
# a == 0 & b == 0: h = 1
inc h
# h_c -> a, b
tst h_c
jmp (+2)
jmp (+5)
dec h_c
inc a
inc b
jmp (-6)

Teste das Code-Schnipsel.

a != b

Gehe analog zum Code-Schnipsel a == b vor.

a < b

Gehe analog zum Code-Schnipsel a == b vor.

a <= b

Gehe analog zum Code-Schnipsel a == b vor.

Suche

v
7.4.2.3.4.2
www.inf-schule.de/rechner/compiler/uebersetzung/erzeugung_code/schablonen/bedingungen

Rückmeldung geben