Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
Jcc
Влияние команды на флаги и форматы команды:
O |
D |
I |
T |
S |
Z |
A |
P |
C |
|
|
|
|
|
|
|
|
|
Код |
Команда |
Описание |
Проц. |
77 cb |
JA rel8 |
Короткий переход, если выше (CF=0 и ZF=0) |
8086 |
73 cb |
JAE rel8 |
Короткий переход, если выше или равно (CF=0) |
8086 |
72 cb |
JB rel8 |
Короткий переход, если ниже (CF=1) |
8086 |
76 cb |
JBE rel8 |
Короткий переход, если ниже или равно (CF=1 или ZF=1) |
8086 |
72 cb |
JC rel8 |
Короткий переход, если перенос (CF=1) |
8086 |
E3 cb |
JCXZ rel8 |
Короткий переход, если CX=0 |
8086 |
E3 cb |
JECXZ rel8 |
Короткий переход, если ECX=0 |
Intel386 |
74 cb |
JE rel8 |
Короткий переход, если равно (ZF=1) |
8086 |
74 cb |
JZ rel8 |
Короткий переход, если нуль (ZF=1) |
8086 |
7F cb |
JG rel8 |
Короткий переход, если больше (ZF=0 и SF=OF) |
8086 |
7D cb |
JGE rel8 |
Короткий переход, если больше или равно (SF=OF) |
8086 |
7C cb |
JL rel8 |
Короткий переход, если меньше (SF<>OF) |
8086 |
7E cb |
JLE rel8 |
Короткий переход, если меньше или равно (ZF=1 или SF<>OF) |
8086 |
76 cb |
JNA rel8 |
Короткий переход, если не выше (CF=1 или ZF=1) |
8086 |
72 cb |
JNAE rel8 |
Короткий переход, если не выше или равно (CF=1) |
8086 |
73 cb |
JNB rel8 |
Короткий переход, если не ниже (CF=0) |
8086 |
77 cb |
JNBE rel8 |
Короткий переход, если не ниже или равно (CF=0 и ZF=0) |
8086 |
73 cb |
JNC rel8 |
Короткий переход, если не перенос (CF=0) |
8086 |
75 cb |
JNE rel8 |
Короткий переход, если не равно (ZF=0) |
8086 |
7E cb |
JNG rel8 |
Короткий переход, если не больше (ZF=1 или SF<>OF) |
8086 |
7C cb |
JNGE rel8 |
Короткий переход, если не больше или равно (SF<>OF) |
8086 |
7D cb |
JNL rel8 |
Короткий переход, если не меньше (SF=OF) |
8086 |
7F cb |
JNLE rel8 |
Короткий переход, если не меньше или равно (ZF=0 и SF=OF) |
8086 |
71 cb |
JNO rel8 |
Короткий переход, если не переполнение (OF=0) |
8086 |
7B cb |
JNP rel8 |
Короткий переход, если нечетно (PF=0) |
8086 |
79 cb |
JNS rel8 |
Короткий переход, если положительно (SF=0) |
8086 |
75 cb |
JNZ rel8 |
Короткий переход, если не нуль (ZF=0) |
8086 |
70 cb |
JO rel8 |
Короткий переход, если переполнение (OF=1) |
8086 |
7A cb |
JP rel8 |
Короткий переход, если паритет (PF=1) |
8086 |
7A cb |
JPE rel8 |
Короткий переход, если четно (PF=1) |
8086 |
7B cb |
JPO rel8 |
Короткий переход, если нечетно (PF=0) |
8086 |
78 cb |
JS rel8 |
Короткий переход, если отрицательно (SF=1) |
8086 |
0F 87 cw/cd |
JA rel16/32 |
Ближний переход, если выше (CF=0 и ZF=0) |
Intel386 |
0F 83 cw/cd |
JAE rel16/32 |
Ближний переход, если выше или равно (CF=0) |
Intel386 |
0F 82 cw/cd |
JB rel16/32 |
Ближний переход, если ниже (CF=1) |
Intel386 |
0F 86 cw/cd |
JBE rel16/32 |
Ближний переход, если ниже или равно (CF=1 или ZF=1) |
Intel386 |
0F 82 cw/cd |
JC rel16/32 |
Ближний переход, если перенос (CF=1) |
Intel386 |
0F 84 cw/cd |
JE rel16/32 |
Ближний переход, если равно (ZF=1) |
Intel386 |
0F 84 cw/cd |
JZ rel16/32 |
Ближний переход, если нуль (ZF=1) |
Intel386 |
0F 8F cw/cd |
JG rel16/32 |
Ближний переход, если больше (ZF=0 и SF=OF) |
Intel386 |
0F 8D cw/cd |
JGE rel16/32 |
Ближний переход, если больше или равно (SF=OF) |
Intel386 |
0F 8C cw/cd |
JL rel16/32 |
Ближний переход, если меньше (SF<>OF) |
Intel386 |
0F 8E cw/cd |
JLE rel16/32 |
Ближний переход, если меньше или равно (ZF=1 или SF<>OF) |
Intel386 |
0F 86 cw/cd |
JNA rel16/32 |
Ближний переход, если не выше (CF=1 или ZF=1) |
Intel386 |
0F 82 cw/cd |
JNAE rel16/32 |
Ближний переход, если не выше или равно (CF=1) |
Intel386 |
0F 83 cw/cd |
JNB rel16/32 |
Ближний переход, если не ниже (CF=0) |
Intel386 |
0F 87 cw/cd |
JNBE rel16/32 |
Ближний переход, если не ниже или равно (CF=0 и ZF=0) |
Intel386 |
0F 83 cw/cd |
JNC rel16/32 |
Ближний переход, если не перенос (CF=0) |
Intel386 |
0F 85 cw/cd |
JNE rel16/32 |
Ближний переход, если не равно (ZF=0) |
Intel386 |
0F 8E cw/cd |
JNG rel16/32 |
Ближний переход, если не больше (ZF=1 или SF<>OF) |
Intel386 |
0F 8C cw/cd |
JNGE rel16/32 |
Ближний переход, если не больше или равно (SF<>OF) |
Intel386 |
0F 8D cw/cd |
JNL rel16/32 |
Ближний переход, если не меньше (SF=OF) |
Intel386 |
0F 8F cw/cd |
JNLE rel16/32 |
Ближний переход, если не меньше или равно (ZF=0 и SF=OF) |
Intel386 |
0F 81 cw/cd |
JNO rel16/32 |
Ближний переход, если не переполнение (OF=0) |
Intel386 |
0F 8B cw/cd |
JNP rel16/32 |
Ближний переход, если нечетно (PF=0) |
Intel386 |
0F 89 cw/cd |
JNS rel16/32 |
Ближний переход, если положительно (SF=0) |
Intel386 |
0F 85 cw/cd |
JNZ rel16/32 |
Ближний переход, если не нуль (ZF=0) |
Intel386 |
0F 80 cw/cd |
JO rel16/32 |
Ближний переход, если переполнение (OF=1) |
Intel386 |
0F 8A cw/cd |
JP rel16/32 |
Ближний переход, если паритет (PF=1) |
Intel386 |
0F 8A cw/cd |
JPE rel16/32 |
Ближний переход, если четно (PF=1) |
Intel386 |
0F 8B cw/cd |
JPO rel16/32 |
Ближний переход, если нечетно (PF=0) |
Intel386 |
0F 88 cw/cd |
JS rel16/32 |
Ближний переход, если отрицательно (SF=1) |
Intel386 |
Описание:
Команды условного перехода (исключая команду JCXZ) проверяют флаги, которые были установлены предыдущей командой. Условия для каждой мнемоники указаны выше. Термины "меньше" и "больше" используются для сравнения знаковых целых, "выше" и "ниже" используются для беззнаковых целых.
Если заданное условие исполняется, то происходит переход на местоположение, указанное операндом, если условие не исполняется то перехода не происходит и процессор продолжает работу со следующей команды.
Команды условного перехода используют непосредственные операнды rel8, rel16 или rel32, которые добавляются к текущему значению указателя команд (EIP) для определения точного адреса перехода. Наиболее эффективны команды с операндом rel8, цель которых может находиться в текущем кодовом сегменте в диапазоне от -128 до +127 байт относительно первого байта следующей команды. Относительный адрес также может задаваться операндом rel16 со значениями от -32768 до +32767 (при атрибуте размера адреса равном 16 бит) или rel32 — от -231 до +231 (при атрибуте размера адреса равном 32 бита).
Когда цель условного перехода находится в другом сегменте, прямое программирование условных дальних переходов не возможно — необходимо использовать противоположную форму команды перехода (например, вместо команды JE — команду JNE) и далее команду безусловного дальнего перехода в другой сегмент. Например, если нельзя запрограммировать:
JZ FARLABEL
то вместо этого программируется:
JNZ BEYOND
JMP FARLABEL
BEYOND:
Исходя из того, что может быть несколько путей интерпретации состояния флагов, большинство ассемблеров обеспечивает более чем одну мнемонику для большинства кодов операций условных переходов. Например, при сравнении двух символов в EAX с последующим условным переходом по их равенству, используется команда JE, а при побитном логическом умножении AX и маски битового поля с переходом только если результат равен нулю, используется команда JZ — синоним команды JE.
Команда JCXZ отличается от других команд условного перехода тем, что она проверяет содержимое регистра CX или ECX на нуль, а не состояние флагов. Команда JCXZ полезна вначале условного цикла, который завершается командой условного цикла (например, такой как LOOPNE). Команда JCXZ предотвращает вхождение в цикл с регистром CX или ECX равным нулю.
Операция:
IF condition
THEN
tempEIP = EIP + SignExtend(DEST);
IF OperandSize = 16
THEN tempEIP = tempEIP AND 0x0000FFFFh;
FI;
IF (tempEIP выходит за пределы кодового сегмента)
THEN #GP(0);
ELSE EIP = tempEIP;
FI;
FI;
Особые ситуации защищенного режима:
#GP(0), если при переходе смещение выходит за пределы кодового сегмента.
Особые ситуации режима реальной адресации:
#GP, если при переходе смещение выходит за пределы кодового сегмента, что возможно только при применении префикса 32-битного адреса.
Особые ситуации режима V86:
#GP, если при переходе смещение выходит за пределы кодового сегмента, что возможно только при применении префикса 32-битного адреса.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru