Справочник по языку Ассемблера IBM PC

     

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

Применение (кроме 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/jecxz удобно использовать со всеми командами, использующими регистр ecx/cx для своей работы. Это команды организации цикла и цепочечные команды. Очень важно отметить то, что команда jcxz/jecxz, в отличие от других команд перехода, может выполнять только близкие переходы в пределах -128...+127 байт, считая от следующей команды. Поэтому для нее особенно актуальна проблема передачи управления далее чем в указанном диапазоне. Для этого можно привлечь команду безусловного перехода jmp. Например, команду jcxz/jecxz можно использовать для предварительной проверки счетчика цикла в регистре cx для обхода цикла, если его счетчик нулевой.
...         jcxz    m1      ;обойти цикл, если cx=0 cycl: ;некоторый цикл         loop    cycl m1:     ...         

См. также: уроки 10, 11 и команду


Содержание раздела