loop návestie
(loop control with CX counter)
V 32-bitovom režime inštrukcia
loop dekrementuje register
ECX a porovná ho s nulou, pričom nezmení hodnoty príznakových bitov. Ak je nový
obsah registra ECX rôzny od nuly, vykoná sa skok na návestie, v opačnom prípade
pokračuje spracovanie programu nasledujúcou inštrukciou. Návestie označuje prvú inštrukciu cyklu.
Pretože obsah ECX sa testuje až po dekrementovaní,
nemôžeme očakávať, že cyklus sa nevykoná ani
raz, ak je na začiatku cyklu hodnota ECX nulová. Ak chceme ošetriť takúto
situáciu, musíme pred prvú inštrukciu cyklu zaradiť príkaz
jecxz – skok na návestie za inštrukciou
loop.
Inštrukcie
loopne návestie
loopnz návestie
dekrementujú register ECX a porovnajú
ho s nulou. Ak je nový obsah registra ECX rôzny od nuly a príznak ZF = 0, vykoná
sa skok na návestie, v opačnom prípade pokračuje spracovanie programu nasledujúcou
inštrukciou.
V nasledujúcom príklade použijeme inštrukcie
loopnz a jecxz.
Úloha
Čítajte znaky zadávané z klávesnice a
ukladajte ich do premennej IOBuffer, kým sa
nestlačí ENTER alebo nezadá MaxPocet znakov.
Riešenie
TITLE MASM CitajRet(main.asm)
INCLUDE Irvine32.inc
MaxPocet EQU 80
IOBuffer DB MaxPocet dup (?)
.code
main PROC
mov ecx,MaxPocet
jecxz Koniec
mov edx,offset IOBuffer
mov edi,0
Citaj: call ReadChar
call WriteChar
mov [edx+edi],al; ulož znak do premennej IOBuffer
inc edi
cmp al,0Dh; bol ENTER?
loopne Citaj; ak nebol, opakuj cyklus
Koniec:
exit
main ENDP
END main
Hore