Организация циклов
Цикл, как известно, представляет собой важную алгоритмическую структуру, без использования которой не обходится, наверное, ни одна программа.
Организовать циклическое выполнение некоторого участка программы можно, к примеру, используя команды условной передачи управления или команду безусловного перехода jmp. При такой организации цикла все операции по его организации выполняются “вручную”. Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики микропроцессора ввели в систему команд группу из трех команд, облегчающую программирование циклов. Эти команды также используют регистр ecx/cx как счетчик цикла.
Дадим краткую характеристику этим командам:
loop метка_перехода (Loop) — повторить цикл. Команда позволяет организовать циклы, подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Работа команды заключается в выполнении следующих действий:
декремента регистра ecx/cx;
сравнения регистра ecx/cx с нулем:
если (ecx/cx) > 0, то управление передается на метку перехода;
если (ecx/cx) = 0, то управление передается на следующую после loop команду.
loope/loopz метка_перехода (Loop till cx <>
0 or Zero Flag = 0) — повторить цикл, пока cx <> 0 или zf = 0.
Команды loope и loopz — абсолютные синонимы, поэтому используйте ту команду, которая вам больше нравиться. Работа команд заключается в выполнении следующих действий:
декремента регистра ecx/cx;
сравнения регистра ecx/cx с нулем;
анализа состояния флага нуля zf:
если (ecx/cx) > 0 и zf = 1, управление передается на метку перехода;
если (ecx/cx) = 0 или zf = 0, управление передается на следующую после loop команду.
loopne/loopnz метка_перехода (Loop till cx <>
0 or Not Zero flag=0) — повторить цикл пока cx <> 0 или zf = 1.
Команды loopne и loopnz также абсолютные синонимы. Работа команд заключается в выполнении следующих действий:
декремента регистра ecx/cx;
сравнения регистра ecx/cx с нулем;
анализа состояния флага нуля zf:
если (ecx/cx) > 0 и zf = 0, управление передается на метку перехода;
если (ecx/cx)=0 или zf=1, управление передается на следующую после loop команду.
Команды loope/loopz и loopne/loopnz по принципу своей работы являются взаимообратными. Они расширяют действие команды loop
тем, что дополнительно анализируют флаг zf, что дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора.
Недостаток команд организации цикла loop, loope/loopz
и loopne/loopnz в том, что они реализуют только короткие переходы (от –128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду jmp, поэтому постарайтесь освоить оба способа организации циклов.