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


Schleifen

Wie schon kurz beschrieben gibt es Schleifen, die das Abbruchkriterium am Schluss abfragen, und welche, die es am Beginn der Schleife abfragen. Eine dritte Form von Programmschleifen durchläuft eine fixe, vorgegebene Zahl von Durchläufen. Die entsprechenden Formulierungen in Hochsprachen wären 'REPEAT...UNTIL', 'WHILE...DO' bzw. 'FOR...NEXT'.

Da für die Schleifentypen REPEAT...UNTIL und WHILE...DO beliebige Abbruchkriterien verwendet werden können, ist in den nachfolgenden Beispielen willkürlich angenommen, dass als Abbruchkriterium das Register A gleich null sein müsse. Unabhängig von der speziellen Abbruchbedingung läuft aber jede Schleifenüberprüfung auf einen expliziten oder impliziten Compare-Befehl hinaus. Zu beachten ist, dass bei Schleifenkörpern, die länger als 127 Byte sind, beim Mikroprozessor Z80 ein absoluter Sprung (JP statt JR) eingesetzt werden muss.

REPEAT...UNTIL

LOOP:       bla         bla         ;beliebiger Schleifenkörper
            bla         bla
            bla         bla
            CP          0           ;Abbruchbedingung A=0
            JR          NZ,LOOP

WHILE...DO

LOOP:       CP          0           ;Abbruchbedingung A=0
            JR          Z,L1
            bla         bla         ;Schleifenkörper
            bla         bla
            bla         bla
            JR          LOOP
;
L1:         bla         bla         ;nächste Anweisung nach der
                                    ;  Schleife

Zur Realisierung einer FOR...NEXT Schleife bietet der Mikroprozessor Z80 einen speziellen Befehl der für eine maximale Anzahl von 256 Schleifendurchläufen eingesetzt werden kann. Dieser Befehl (DJNZ = Decrement and Jump if Not Zero) dekrementiert den Schleifenzähler (Register B) und führt einen relativen Sprung aus, falls der Schleifenzähler nicht gleich null ist. Das folgende Programmbeispiel zeigt eine Schleife vom Typ FOR...NEXT mit 15 Durchläufen.

            LD          B,15        ;Schleifenzähler laden
LOOP:       bla         bla         ;Schleifenkörper
            bla         bla
            bla         bla
            DJNZ        LOOP        ;Abbruchbedingung (B=0)

Nach der vollständigen Ausführung der Schleife ist das Register B gleich null. Zu beachten ist, dass das Register B in der Schleife nicht verändert werden darf, da dies zu unkontrollierten Schleifendurchläufen führen würde. Benötigt man das Register B innerhalb der Schleife für andere Zwecke, so muss es am Beginn des Schleifenkörpers am Prozessorstack zwischengespeichert und am Ende des Schleifenkörpers wiederhergestellt werden. Das folgende Programmbeispiel zeigt eine mögliche Implementation:

            LD          B,15        ;Schleifenzähler laden
LOOP:       PUSH        BC          ;Zähler zwischenspeichern
            bla         bla         ;Schleifenkörper
            bla         bla
            bla         bla
            POP         BC          ;Schleifenzähler restaurieren
            DJNZ        LOOP        ;Abbruchbedingung (B=0)

Benötigt man eine Schleife, die mehr als 256 Durchgänge besitzt, so kann der Befehl DJNZ nicht eingesetzt werden. Es muss dann ein zweites Register (z.B. Register C) als erweiterter Schleifenzähler hinzugezogen werden. Da der Befehl 'DEC BC' das Zero-Flag nicht setzt, muss der Nulldurchgang durch ein logisches ODER der Register B und C abgefragt werden (BC ist ungleich null, wenn entweder Register B oder Register C ungleich null ist).

            LD          BC,388      ;Schleifenzähler laden
LOOP:       bla         bla         ;Schleifenkörper
            bla         bla
            bla         bla
            DEC         BC          ;Abbruchbedingung (BC=0)
            LD          A,B
            OR          C
            JR          NZ,LOOP


Last Update: 2008-05-31