JCC JCXZ/JECXZ
(Jump if condition)
(Jump if CX=Zero/ Jump if ECX=Zero)
Переход, если выполнено условие
Переход, если CX/ECX равен нулю
Схема команды: | jcc метка jcxz метка jecxz метка |
Назначение: переход внутри текущего сегмента команд в зависимости от некоторого условия.
Алгоритм работы команд (кроме jcxz/jecxz):
Проверка состояния флагов в зависимости от кода операции (оно отражает проверяемое условие):
если проверяемое условие истинно, то перейти к ячейке, обозначенной операндом;
если проверяемое условие ложно, то передать управление следующей команде.
Алгоритм работы команды jcxz/jecxz:
Проверка условия равенства нулю содержимого регистра ecx/cx:
если проверяемое условие истинно, то есть содержимое ecx/cx
равно 0, то перейти к ячейке, обозначенной операндом метка;
если проверяемое условие ложно, то есть содержимое ecx/cx
не равно 0, то передать управление следующей за jcxz/jecxz команде программы.
Состояние флагов после выполнения команды:
11 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
OF | SF | ZF | 0 | AF | 0 | PF | 1 | CF |
? | ? | ? | r | ? | r |
Применение (кроме jcxz/jecxz):
Команды условного перехода удобно применять для проверки различных условий, возникающих в ходе выполнения программы. Как известно, многие команды формируют признаки результатов своей работы в регистре eflags/flags. Это обстоятельство и используется командами условного перехода для работы. Ниже приведены перечень команд условного перехода, анализируемые ими флаги и соответствующие им логические условия перехода.
Команда | Состояние проверяемых флагов | Условие перехода |
JA | CF = 0 и ZF = 0 | если выше |
JAE | CF = 0 | если выше или равно |
JB | CF = 1 | если ниже |
JBE | CF = 1 или ZF = 1 | если ниже или равно |
JC | CF = 1 | если перенос |
JE | ZF = 1 | если равно |
JZ | ZF = 1 | если 0 |
JG | ZF = 0 и SF = OF | если больше |
JGE | SF = OF | если больше или равно |
JL | SF <> OF | если меньше |
JLE | ZF=1 или SF <> OF | если меньше или равно |
JNA | CF = 1 и ZF = 1 | если не выше |
JNAE | CF = 1 | если не выше или равно |
JNB | CF = 0 | если не ниже |
JNBE | CF=0 и ZF=0 | если не ниже или равно |
JNC | CF = 0 | если нет переноса |
JNE | ZF = 0 | если не равно |
JNG | ZF = 1 или SF <> OF | если не больше |
JNGE | SF <> OF | если не больше или равно |
JNL | SF = OF | если не меньше |
JNLE | ZF=0 и SF=OF | если не меньше или равно |
JNO | OF=0 | если нет переполнения |
JNP | PF = 0 | если количество единичных битов результата нечетно (нечетный паритет) |
JNS | SF = 0 | если знак плюс (знаковый (старший) бит результата равен 0) |
JNZ | ZF = 0 | если нет нуля |
JO | OF = 1 | если переполнение |
JP | PF = 1 | если количество единичных битов результата четно (четный паритет) |
JPE | PF = 1 | то же, что и JP, то есть четный паритет |
JPO | PF = 0 | то же, что и JNP |
JS | SF = 1 | если знак минус (знаковый (старший) бит результата равен 1) |
JZ | ZF = 1 | если ноль |
Логические условия "больше" и "меньше" относятся к сравнениям целочисленных значений со знаком, а "выше и "ниже" — к сравнениям целочисленных значений без знака. Если внимательно посмотреть, то у многих команд можно заметить одинаковые значения флагов для перехода. Это объясняется наличием нескольких ситуаций, которые могут вызвать одинаковое состояние флагов. В этом случае с целью удобства ассемблер допускает несколько различных мнемонических обозначений одной и той же машинной команды условного перехода. Эти команды ассемблера по действию абсолютно равнозначны, так как это одна и та же машинная команда. Изначально в микропроцессоре i8086 команды условного перехода могли осуществлять только короткие переходы в пределах -128...+127 байт, считая от следующей команды. Начиная с микропроцессора i386, эти команды уже могли выполнять любые переходы в пределах текущего сегмента команд. Это стало возможным за счет введения в систему команд микропроцессора дополнительных машинных команд. Для реализации межсегментных переходов необходимо комбинировать команды условного перехода и команду безусловного перехода jmp. При этом можно воспользоваться тем, что практически все команды условного перехода парные, то есть имеют команды, проверяющие обратные условия.
Применение jcxz/jecxz:
Команда | Состояние флагов в eflags/flags | Условие перехода |
JCXZ | не влияет | если регистр CX=0 |
JECXZ | не влияет | если регистр ECX=0 |
... jcxz m1 ;обойти цикл, если cx=0 cycl: ;некоторый цикл loop cycl m1: ... |