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.