FE23  LOOCH  DISASM

СПРАВОЧНИК  ПО  КОМАНДАМ
ПРОЦЕССОРОВ  x86

(empty)
Главная Загрузка Инструкция Команды 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 переход может быть только в пределах от (-128) до (+127). Адрес типа NEAR кодируется двумя байтами в режиме 16 бит и четырьмя байтами в режиме 32 бита.

Всего есть 16 разных условий, им соответствует 16 разных кодов команд на уровне процессора. Но на уровне языка ассемблера эти условия превращаются в 30 разных команд. Таким образом, одна и та же команда процессора может иметь разные имена (синонимы) на языке ассемблера.

Кодирование

 Команда (asm) Тип адреса  Код  Формат 
 J(cond) SHORT  70+cond ----cond  addr(1)
 J(cond) NEAR  0F 80+cond ----cond  addr(2/4)

Примечание. Код условия (cond) может иметь значение от 0 до F (hex).

Условия при сравнении чисел без знака

 Код
 (cond)
 Команда
 (asm)
 Флажки
 
Условие
 (eng)
Условие
 (рус)
 0100 JE ZF=1 if equalесли равно
 0101 JNE ZF=0 if not equalесли не равно
 0010
 
 JB
/JNAE
 CF=1
 
if below
/not above or equal
если меньше
/не больше или равно
 0011
 
 JAE
/JNB
 CF=0
 
if above or equal
/not below
если больше или равно
/не меньше
 0110
 
 JBE
/JNA
 CF=1
or ZF=1
if below or equal
/not above
если меньше или равно
/не больше
 0111
 
 JA
/JNBE
 CF=0
and ZF=0
if above
/not below or equal
если больше
/не меньше или равно

Условия при сравнении чисел со знаком

 Код
 (cond)
 Команда
 (asm)
 Флажки
 
Условие
 (eng)
Условие
 (рус)
 0100 JE ZF=1 if equalесли равно
 0101 JNE ZF=0 if not equalесли не равно
 1100
 
 JL
/JNGE
 SF!=OF
 
if less
/not greater or equal
если меньше
/не больше или равно
 1101
 
 JGE
/JNL
 SF=OF
 
if greater or equal
/not less
если больше или равно
/не меньше
 1110
 
 JLE
/JNG
 ZF=1
or SF!=OF
if less or equal
/not greater
если меньше или равно
/не больше
 1111
 
 JG
/JNLE
 ZF=0
or SF=OF
if greater
/not less or equal
если больше
/не меньше или равно

Условия по отдельным флажкам

 Код
 (cond)
 Команда
 (asm)
 Флажки
 
Условие
 (eng)
Условие
 (рус)
 0100 JZ ZF=1 if zeroесли есть флаг нуля
 0101 JNZ ZF=0 if not zeroесли нет флага нуля
 1000 JS SF=1 if signесли есть флаг знака
 1001 JNS SF=0 if not signесли нет флага знака
 0010 JC CF=1 if carryесли есть флаг переноса
 0011 JNC CF=0 if not carryесли нет флага переноса
 0000 JO OF=1 if overflowесли есть флаг переполнения
 0001 JNO OF=0 if not overflowесли нет флага переполнения
 1010
 
 JP
/JPE
 PF=1
 
if parity
/parity even
если есть флаг четности
/четный 
 1011
 
 JNP
/JPO
 PF=0
 
if not parity
/parity odd
если нет флага четности
/нечетный 

Все условия, упорядоченные по кодам (cond)
   и соответствующие коды операций

В этой таблице показаны также и соответствующие коды операций для команд с адресом типа SHORT и для команд с адресом типа NEAR.

 Код для
 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
JNBE  Lab02
JZ  SHORT metka
JC  NEAR met44


Команды установки байта по условию

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
SETZ  AL
SETNAE  DH
 SET(cond)  mem8
SETNGE  name
SETO  BYTE PTR [BX]
SETC  array [EDI]


Команда перехода для повторения цикла

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
 
Все команды по алфавиту (кратко)
Все команды по алфавиту (подробно)
Первый байт кода операций
Второй байт кода операций
 


Главная Загрузка Инструкция Команды x86 Карта сайта


 
Copyright (C) FE23 Looch Disasm, 2011
File          - refe20.htm
File created  - 03 May 2011
Last modified - 30 Jun 2011
Hosted by uCoz