lp:=lp-1
C,l_powt /zainicjowanie licznika na wartość pocz.
/etykieta początkowa pętli programowej inne działania wewn. pętli
C /dekrementacja licznika lp
NZ,powt /skok na początek pętli gdy lp>0
LD
powt:
DEC JR
Powyższa implementacja pętli programowej wykorzystuje ustawianie flagi Z przez rozkaz DEC w sytuacji wyzerowania dekrementowanego przez ten rozkaz operandu. Powyższe rozwiązanie ma jeszcze jedną zaletę: możliwe jest wykonanie pętli 256 razy. Aby to uzyskać wystarczy zainicjować licznik pętli na 0. Podobny efekt można uzyskać przy wykorzystaniu rozkazu inkrementacji:
LD C,256-l_powt
powt: ;etykieta początkowa pętli programowej
; ... inne działania wewn. pętli
INC C ;inkrementacja licznika lp
JR NZ,powt ;skok na początek pętli gdy lp>0
Procesor eZ80 ma także dedykowany rozkaz DJNZ do obsługi pętli programowej:
LD B,ljpowt /zainicjowanie licznika na wartość pocz. powt: /etykieta początkowa pętli programowej
/ ... inne działania wewn. pętli
DJNZ powt /skok na początek pętli gdy lp<l_powt
DEC |
BC |
/dekrement licznika pętli |
LD |
A,B | |
OR |
C |
/czy wyzerowany |
JR |
NZ,powt |
/skok jeśli nie |
Jego użycie jest najwygodniejszym sposobem na realizację pętli programowej, pozwala wykonać ją nawet 256 razy, jednak wymaga zawsze użycia rejestru B. Wszystkie powyższe przykłady realizacji w asemblerze Z80 zakładają że liczba powtórzeń pętli nie przekracza 256. Gdy pętla programowa powinna mieć większą liczbę powtórzeń, należy użyć dwubajtowego licznika. W takim przypadku korzystamy z rozkazów DEC lub INC operujących na rejestrach 16-bitowych (BC, DE, HL, IX, IY). Niestety rozkazy te nie zmieniają żadnej z flag, dlatego sprawdzenie czy 16-bitowy operand wyzerował się należy wykonać w sposób opisany wcześniej, np. przez policzenie sumy logicznej jego bajtów składowych:
Przy operowaniu na złożonych strukturach danych (np. tablice co najmniej dwuwymiarowe) zachodzi potrzeba zagłębiania pętli programowych jedna w drugiej.
1-13