DCPU-16: Logische Operatoren und Syntax

Hallo und willkommen zurück! Dieser Artikel beschäftigt sich mit logischen Operatoren. Wir werden erfahren, was diese Operatoren bezwecken, und wie man sie einsetzt.

Was sind eigentlich logische Operatoren?

Ein Logischer Operator ist eine Funktion, die einen Wahrheitswert liefert
Mit logischen Operatoren bilden wir einen Ausdruck, dessen Ergebnis ein Wahrheitswert (Ja oder Nein – true oder false) wiedergibt. Damit können wir also mehrere Werte auf bestimmte Merkmale hin überprüfen.
Die einfachste Prüfung ist natürlich, zu entscheiden, ob 2 Werte Identisch sind (exakt gleich).
Bei der DCPU-16 lautet die Anweisung hierfür IFE – If Equal. In höheren Programmiersprachen entspricht dies dem Vergleichsoperator ==.
Wichtig ist hierbei nur, dass der Typ der Werte die verglichen werden sollen, identisch ist. Man kann schlecht einen String (Zeichenkette) mit einem Integer (Ganzzahl) vergleichen, 123 == „bla“ ergibt keinen Sinn. Je nach Programmiersprache ist diese Aussage false, oder führt zum Crash.
Auch „123“ == 123 ist falsch: Jeder Buchstabe in der Zeichenkette „123“ wird durch (normalerweise) 1 Byte gekennzeichnet. Das Byte mit dem Wert 65 Entspricht zum Beispiel dem Buchstaben A. Die „123“ ist nun auch eine Zeichenkette. Wir haben hier keine Zahl mit dem Wert 123, sondern 3 Buchstaben. Im ASCII-Zeichensatz hat „1“ den Wert 49, „2“ = 50, „3“ = 51.
Sind beide Werte vom gleichen Typ, können sie auch logisch miteinander verglichen werden:
(518 == 518)=true, (16 == 0x0F)=true, („Hallo“ == „hallo“)=false (Groß- und Kleinbuchstaben unterscheiden sich)


Neben Prüfung auf Gleichheit, können wir natürlich auch auf Ungleichheit prüfen:
IFN – If Not – negiert die Aussage eines IFE Ausdrucks. Dieser Operator ist auch als != bekannt.
(1 != 2)=true, 1 ist nicht gleich 2
(1 != 1)=false, 1 IST gleich 1
Kleiner Trick: (1 == 1)=true, das Ergebnis wird negiert,  also ist (1!=1)=false
(1 == 2)=false, durch Negierung: (1!=2)=true
IFE und IFN Operationen können mit jedem Wertetyp durchgeführt werden. Häufig wird in Anwendungen mit Zahlen gearbeitet. Für Zahlen gibt es den Operator IFG (If Greater [than]).
Hiermit kann entschieden werden, ob eine Zahl größer als eine Andere ist.
IFG 5, 10
Prüft, ob 5 > 10 ist. Das ist natürlich nicht der Fall, 5 > 10 = false.
Soll nun geprüft werden, ob 5 kleiner als 10 ist, kann man die Operanden (die Werte) einfach Vertauschen:
IFG 10,5
10 > 5 = true
Ein Operator aus den Spezifikationen fehlt noch:
IFB – If Bits(/Blank?). Der Operator prüft, ob die logisch mit AND miteinander verknüpften Werte, ungleich 0 sind. Zuerst wird A AND B ausgeführt, danach wird das Ergebnis auf Ungleichheit mit 0 hin untersucht.

IFB 85, 36 = true:

Ausdruck Ergebnis (binär)
85d 01010101
36d 00100100
85d AND 36d 00000100

Die beiden Werte wurden mit AND verknüpft. Das Ergebnis 00000100 ist nicht 0, (00000100 != 0) = true.
IFB 85, 170 = false:

Ausdruck Ergebnis (binär)
85d 01010101
170d 10101010
85d AND 170d 00000000

Das Ergebnis 00000000 == 0, ist also nicht != 0.(Doppelte Negierung…)

Einsatz der Operatoren in Assembly Code

Der Einsatz wurde in einem vorherigen Artikel nur kurz angerissen:
Zuerst stellt man seinen Ausdruck zusammen, soll 0 == 1 geprüft werden:
IFE 0, 1
Dieser Ausdruck wird von der CPU ausgeführt. Ist der Ausdruck wahr, wird die nächste Anweisung ausgeführt. Ist der Ausdruck nicht wahr, wird die übernächste Anweisung ausgeführt.
Logische Operationen benötigen also immer 3 Anweisungen:
Prüf-Anweisung, Anweisung für true, Anweisung für False.
Nach Prüfung wird eine der beiden Anweisungen für true/false ausgeführt, danach wird die dritte Anweisung nach der Prüf-Anweisung ausgeführt. Ein einfaches Beispiel:

IFE A, B
ADD A, 1
SUB A, 1
ADD A, B

Ist A == B, wird A=A+1 ausgeführt, wenn nicht A=A-1; Danach wird normal mit dem Programm fortgefahren, A = A+B wird ausgeführt, egal was das Ergebnis des logischen Ausdrucks war.
Mit den Befehlen SET PC, [] und JSR [] (JumpSubRoutine), kann man nun an andere Stellen im Code springen, so wie wir es schon im Artikel über Schleifen getan haben.
Bei Fragen/Ideen/Kritik wie immer: bitte in die Kommentare.
MfG
Damon

Dieser Eintrag wurde veröffentlicht in 0x10c und getagged , , .
Bookmarken: Permanent-Link Schreibe einen Kommentar oder hinterlasse einen Trackback: Trackback-URL.
Achtung: Wordpress interpretiert bestimmte Zeichenfolgen als Markup und verändert diese. Nutzt für Programmcode lieber Gist oder PasteBin-Services und verlinkt die Code-Schnipsel.

Post a Comment

Ihre E-Mail wird niemals veröffentlicht oder verteilt. Benötigte Felder sind mit * markiert

*
*

Du kannst diese HTML Tags und Attribute verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>