Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier. |
Home Mikroprozessoren Programmierung eines Mikrocomputers Schleifen | ||
Siehe auch: Bedingte Verzweigungen | ||
|
||
Schleifen
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
|
||
Home Mikroprozessoren Programmierung eines Mikrocomputers Schleifen |