Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier.


Bedingte Verzweigungen

Bedingte Verzweigungen werden sehr häufig benötigt und entsprechen den 'IF...THEN...ELSE'-Anweisungen von Hochsprachen. Als Bedingungen werden sehr oft Vergleichsoperatoren herangezogen. Eine IF...THEN...ELSE-Konstruktion würde man beispielsweise so programmieren:

            CP          $34         ; IF A=$34
            JR          NZ,L1       ; Sprung auf ELSE-Teil, falls
                                    ; Bedingung nicht erfüllt
            bla         bla         ; THEN
            bla         bla
            bla         bla
            JR          L2
;
L1:         bla         bla         ; ELSE
            bla         bla
            bla         bla
;
L2:         bla         bla         ; nächste Anweisung nach
                                    ; IF..THEN..ELSE

Zu beachten ist, dass die Sprungbedingung komplementär zur Bedingung für den THEN-Teil ist.

Die folgenden Beispiele sollen anhand von konkretem Z80-Code zeigen, wie man die wichtigsten Vergleiche in Z80-Assembler formuliert. In den angeführten Beispielen soll der Inhalt des Registers A mit der Zahl $34 verglichen werden, und entsprechend dem gewünschten Vergleich der Programmfluss kontrolliert werden. Es wird nur jeweils der Vergleichsteil aufgelistet, der restliche Teil der bedingten Verzweigung entspricht dem obigen Beispiel.

Gleichheit, Ungleicheit

Zur Abfrage der Gleichheit kann man nach dem Compare-Befehl das Zero-Flag abfragen. Ist dieses auf eins gesetzt, so sind die Operanden gleich, ansonsten sind sie ungleich.

GLEICH

            CP          $34         ;A = $34 ?
            JP          NZ,L1       ;Sprung falls A <> $34
            bla         bla         ;THEN
L1:

UNGLEICH

            CP          $34         ;A <> $34  ?
            JP          Z,L1        ;Sprung falls A = $34
            bla         bla         ;THEN
L1:

Alle anderen Vergleiche werden mit Hilfe des Carry-Flags und eventuell gemeinsam mit dem Zero-Flag angestellt.

Kleiner, Kleiner-gleich

Zum Vergleich auf kleiner-gleich wird nach dem Compare-Befehl sowohl das Carry-Flag als auch das Zero-Flag abgefragt. Ist entweder das Zero- oder das Carry-Flag gesetzt, so ist das Register A kleiner oder gleich dem Vergleichswert $34. Möchte man nur abfragen, ob der Akkumulator kleiner als $34 ist, so genügt die Abfrage des Carry-Flags alleine.

KLEINER-GLEICH

            CP          $34         ;A <= $34 ?
            JR          Z,L3
            JR          NC,L1
L3:         bla         bla         ;THEN
L1:

KLEINER

            CP          $34         ;A < $34
            JP          NC,L1
            bla         bla         ;THEN
L1:

Größer, Größer-gleich

Die Abfrage, ob der Akkumulator größer oder gleich dem Vergleichswert ist, wird durch Abfrage des Carry-Flags bewerkstelligt. Ist dieses nicht gesetzt, so ist der Akkumulator größer oder gleich dem Vergleichswert. Etwas anders ist die Situation beim Vergleich auf größer. Für diesen Vergleich gibt es keine direkte Abfrage. Man muss zuerst die Abfrage auf Gleichheit stellen und bei gegebener Gleichheit die nachfolgende größer-gleich-Abfrage überspringen.

GRÖSSER-GLEICH

CP $34 ;A >= $34 JR C,L1 bla bla ;THEN L1:

GRÖSSER

            CP          $34         ;A > $34
            JR          Z,L1
            JR          C,L1
            bla         bla         ;THEN
L1:


Last Update: 2008-05-31