FE23 LOOCH DISASMСПРАВОЧНИК ПО КОМАНДАМ
|
Главная | Загрузка | Инструкция | Команды x86 | Карта сайта |
УСЛОВНЫЕ КОМАНДЫУсловная команда - это такая команда, выполнение которой зависит от каких-либо условий. Например, требуется определенная установка флажков или необходимо наличие нуля в некотором регистре. Самыми употребительными из всех условных команд являются команды условной передачи управления. Условные команды: Команды JE, JNE, JA, JB, ... (и т.д.) - условная передача управления (переход, если условие удовлетворяется). Команды SETE, SETNE, SETA, SETB, ... (и т.д.) - установка байта по условию. Команды LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ - переход для повторения цикла. Команды JCXZ, JECXZ - переход, если значение счетчика равно нулю. Команды условной передачи управленияJE, JNE, JA, JB, ... Если условие истинно (TRUE), то происходит переход по указанному адресу, иначе (FALSE) переход не происходит и выполняется следующая по порядку команда.
Для перехода задается относительный адрес, то есть, смещение
относительно адреса команды, следующей после данной команды.
Задаваемый на ассемблере адрес может иметь тип SHORT или тип NEAR.
Адрес типа SHORT кодируется в команде всего одним байтом.
Поэтому для адреса типа SHORT переход может быть только в пределах
Всего есть 16 разных условий, им соответствует 16 разных кодов команд на уровне процессора. Но на уровне языка ассемблера эти условия превращаются в 30 разных команд. Таким образом, одна и та же команда процессора может иметь разные имена (синонимы) на языке ассемблера. Кодирование
Примечание. Код условия (cond) может иметь значение от 0 до F (hex). Условия при сравнении чисел без знака
Условия при сравнении чисел со знаком
Условия по отдельным флажкам
Все условия, упорядоченные по кодам (cond)
|
Код для SHORT | Код для NEAR |
Код (cond) | Команда (asm) |
Флажки |
70 | 0F 80 | 0000 | JO | OF=1 |
71 | 0F 81 | 0001 | JNO | OF=0 |
72 | 0F 82 | 0010 | JB/JNAE/JC | CF=1 |
73 | 0F 83 | 0011 | JAE/JNB/JNC | CF=0 |
74 | 0F 84 | 0100 | JE/JZ | ZF=1 |
75 | 0F 85 | 0101 | JNE/JNZ | ZF=0 |
76 | 0F 86 | 0110 | JBE/JNA | CF=1 or ZF=1 |
77 | 0F 87 | 0111 | JA/JNBE | CF=0 and ZF=0 |
78 | 0F 88 | 1000 | JS | SF=1 |
79 | 0F 89 | 1001 | JNS | SF=0 |
7A | 0F 8A | 1010 | JP/JPE | PF=1 |
7B | 0F 8B | 1011 | JNP/JPO | PF=0 |
7C | 0F 8C | 1100 | JL/JNGE | SF!=OF |
7D | 0F 8D | 1101 | JGE/JNL | SF=OF |
7E | 0F 8E | 1110 | JLE/JNG | ZF=1 or SF!=OF |
7F | 0F 8F | 1111 | JG/JNLE | ZF=0 or SF=OF |
Форматы | Примеры | ||||||
J(cond) label |
|
SETE, SETNE, SETA, SETB, ...
В команде установки байта SET(cond) используется тот же самый набор из 16 условий, что и в команде условной передачи управления J(cond). И в мнемонике на языке ассемблера эти условия представляются такими же 30-ю способами.
На языке ассемблера команда имеет один операнд. Это может быть либо 8-битный регистр, либо адрес в памяти.
Команда заносит в байт, указанный в операнде, значение 1, если условие выполняется (TRUE), и значение 0 в противном случае (FALSE).
Команда (asm) | Код | Формат |
SET(cond) | 0F 90+cond /000 | ----cond NNN |
Примечания.
1. Код условия (cond) может иметь значение от 0 до F (hex).
2. В байте (mod,reg,r/m) трехбитное поле reg должно быть
равно 000.
Форматы | Примеры | ||||||
SET(cond) reg8 |
| ||||||
SET(cond) mem8 |
|
LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ
Эти команды используются для управления циклом со счетчиком в регистре CX (или в регистре ECX).
При выполнении команды сначала происходит декремент (уменьшение на единицу) счетчика в регистре. (При этом никакие флажки не изменяются.) В дальнейшем, при проверке условий, действует уже измененное значение счетчика.
Если атрибут размера адреса равен 16 битам, то счетчиком служит регистр CX, если этот атрибут равен 32 битам, то регистр ECX.
Если условия (см. в таблице ниже) выполняются, то происходит переход по указанному адресу.
В условиях, кроме значения счетчика, учитывается еще и флажок нуля. Значение флажков вырабатываются командами, предшествующими команде LOOP.
Для перехода задается адрес типа SHORT, то есть, относительный адрес из одного байта. Поэтому переход может быть в пределах от (-128) до (+127) относительно адреса команды, следующей после команды LOOP.
См. в таблице ниже.
JCXZ, JECXZ
Переход по указанному адресу происходит в том случае, если значение счетчика равно нулю. Счетчиком служит регистр CX, если установлен режим 16 бит, или регистр ECX, если режим 32 бита.
Для перехода задается адрес типа SHORT, то есть, относительный адрес из одного байта. Поэтому переход может быть в пределах от (-128) до (+127) относительно адреса команды, следующей после команды JCXZ.
Данная команда не изменяет содержимое регистра CX (или ECX) и не изменяет флажки.
Обычно процессор выполняет команду JCXZ дольше, чем вот такие две команды: команда сравнения содержимого регистра с нулем плюс команда условного перехода по флажку. По этой причине команда JCXZ обычно заменяется на другие команды.
Команда (asm) |
Условие перехода | Тип адреса |
Код | Формат |
LOOPNE /LOOPNZ |
CX != 0 and ZF = 0 | SHORT |
E0 |
-------- addr(1) |
LOOPE /LOOPZ |
CX != 0 and ZF = 1 | SHORT |
E1 |
-------- addr(1) |
LOOP |
CX != 0 | SHORT |
E2 |
-------- addr(1) |
JCXZ /JECXZ |
CX = 0 | SHORT |
E3 |
-------- addr(1) |
Главная | Загрузка | Инструкция | Команды x86 | Карта сайта |