54. Команды для программирования циклов.
1) Jcxz метка_перехода – переход осуществляется, если cx=0
Команда JCXZ выполняет здесь две функции: предотвращает выполнение «пустого» цикла (когда счетчик цикла в СХ равен нулю) и отслеживает окончание цикла после обработки всех элементов поля mas. Команда DEC после каждой итерации цикла уменьшает значение счетчика в регистре СХ на 1. При такой организации цикла все операции по его организации выполняются «вручную». Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики процессора ввели в систему команд группу из трех команд, облегчающую программирование циклов. Эти команды также используют регистр ЕСХ/СХ как счетчик цикла.
loop метка_перехода
Команда реализует описанные далее действия.
1. Декремент регистра ЕСХ/СХ.
2. Сравнение регистра ЕСХ/СХ с нулем:
П если (ЕСХ/СХ) > 0, то управление передается на метку перехода;
П если (ЕСХ/СХ) = 0, то управление передается на следующую после LOOP команду.
Команды LOOPE и LOOPZ (Loop still сх <> 0 or Zero flag = 0 — повторить цикл пока
СХ <> 0 или ZF = 0)
Синтаксис команд: loope/loopz метка_перехода. Команды реализуют описанные далее действия.
1. Декремент регистра ЕСХ/СХ.
2. Сравнение регистра ЕСХ/СХ с нулем и анализ состояния флага нуля ZF:
П если (ЕСХ/СХ) > 0 и ZF = 1, управление передается на метку перехода;
если (ЕСХ/СХ) = 0 или ZF=0, управление передается на следующую после ШОР
команду.
Команды LOOPNE и LOOPNZ (Loop still ex <> 0 or NonZero flag = 0 — повторить
цикл, пока СХ <> 0 или ZF = 1) Синтаксис команд: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.