LOOPE/LOOPZ LOOPNE/LOOPNZ
(LOOP control by register cx not equal 0 and ZF=1)
(LOOP control by register cx not equal 0 and ZF=0)
Управление циклом по cx c учетом значения флага ZF
Схема команды: | loope/loopz метка loopne/loopnz метка |
Назначение: организация цикла со счетчиком в регистре cx с учетом флага zf.
Алгоритм работы:
выполнить декремент содержимого регистра ecx/cx;
проанализировать регистр ecx/cx:
если ecx/cx=0, передать управление следующей за loopxx команде;
если ecx/cx=1, передать управление команде, метка которой указана в качестве операнда loopxx;
анализ флага zf:
если zf=0, для команд loope/loopz это означает выход из цикла, для команд loopne/loopnz — переход к началу цикла;
если zf=1, для команд loope/loopz это означает переход к началу цикла, для команд loopne/loopnz — выход из цикла.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команды loopxx удобно использовать вместе с командами, которыe в результате своей работы меняют значение флага zf. Типичный пример — команда сравнения cmp.
;найти первый пробел в строке символов str db 'Найти первый пробел' str_size=$-str ... cld mov cx,str_size lea si,str cycl: lodsb cmp al,' ' loopne cycl jcxz m1 ;переход, если пробелов нет dec si ;в si — адрес пробела в строке str ... m1 |
См. также: уроки 8, 10, 11 и команду