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