Команда Loop

Команда JMP в примере 7.1 реализует бесконечный цикл. Но более вероятно, что подпрограмма должна выполнять конечное число циклов. Команда LOOP, которая служит для этой цели, использует начальное значение в регистре CX. В каждом цикле команда LOOP автоматически уменьшает содержимое регистра CX на 1. Пока значение в CX не равно нулю, управление передается по адресу, указанному в операнде, и если в CX будет 0, управление переходит на следующую после LOOP команду.

Пример 7.2. Использование команды LOOP.

masm

model small

.code

start:

mov ax,01; инициализация ax,

mov bx,01; bx,

mov dx,01; и dx

mov cx,10; число циклов

a20:

inc ax; ax++

add bx,ax; bx = bx + ax

shl dx,1; удвоить dx

loop a20; уменьшить cx и повторить

; цикл, если не нуль

mov ax,4c00h; завершить программу

int 21h

end start

Программа в примере 7.2, иллюстрирующая использование команды LOOP, выполняет действия, похожие на пример 7.1 за исключением того, что после десяти циклов программа завершается. Команда MOV инициализирует регистр CX значением 10. Так как команда LOOP использует регистр CX, то в программе для удвоения начального значения 1 вместо регистра CX используется DX. Команда JMP A20 заменена командой LOOP и для эффективности команда ADD AX,01 заменена командой INC AX (увеличение AX на 1).

Аналогично команде JMP, операнд команды LOOP определяет расстояние от конца команды LOOP до адреса метки A20. Для команды LOOP это расстояние должно быть в пределах от -128 до +127 байт. Если операнд превышает эти границы, то ассемблер выдаст сообщение "Relative jump out of range" (превышены границы перехода).

Для проверки можно сгенерировать исполняемые модули для примеров 7.1 и 7.2 и запустить их в отладочном режиме в программе Turbo Debugger.

Дополнительно существует две разновидности команды LOOP – это LOOPE (или LOOPZ) и LOOPNE (или LOOPNZ). Обе команды также уменьшают значение регистра CX на 1. Команда LOOPE передает управление по адресу операнда, если регистр CX имеет ненулевое значение и флаг нуля установлен (ZF=1). Команда LOOPNE передает управление по адресу операнда, если регистр CX имеет ненулевое значение и флаг нуля сброшен (ZF=0).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: