Loopne/loopnz метка_перехода

Команды реализуют описанные далее действия.

1. Декремент регистра СХ.

2. Сравнение регистра СХ с нулем и анализ состояния флага нуля ZF:

ü если (СХ) > 0 и ZF = 0, управление передается на метку перехода;

ü если (СХ) = 0 или ZF = 1, управление передается на следующую после LOOP команду.

Команды LOOPE/LOOPZ и LOOPNE/LOOPNZ по принципу своей работы являются взаимнообратными. Они расширяют действие команды LOOP тем, что дополнительно анализируют флаг ZF. Это дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора. Типичное применение этих команд связано с операцией поиска определенного значения в последовательности или со сравнением двух чисел.

Недостаток команд организации цикла LOOP, LOOPE/LOOPZ и LOOPNE/LOOPNZ заключается в том, что они реализуют только короткие переходы (от -128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду JMP

Пример. Подсчет нулевых байтов с использованием команд управления циклом

model small

.stack 100h

.data

len equ 10 ;количество элементов в mas

mas db 1,0,9,8,0,7,8,0,2,0

.code

start:

mov ax,@data

mov ds,ax

mov сx,len

xor ax,ax

xor si,si

jcxz exit

cycl:

cmp mas[si],0

jne ml

inc al

ml:

inc si

loop cycl

exit:

mov ax,4c00h

int 21h

end start

У команды JCXZ осталась только одна функция – не допустить выполнения «пустого» цикла, поэтому несколько изменилось ее место в тексте программы: теперь она стоит перед меткой начала цикла cycl. Изменение и контроль содержимого регистра СХ в процессе выполнения каждой итерации выполняет команда LOOP.