Таблица. Инструкции пересылки данных
Инструкция Описание
BSWAP Перестановка байт из порядка младший-старший (L-H) в порядок старший-младший (H-L) (486+)
CBW/CWDE Преобразование байта AL в слово АХ (расширение знака AL в АН: АН заполняется битом AL.7) или слова АХ в двойное слово ЕАХ
CMOVA/CMOVNBE Пересылка, если выше "CF ИЛИ ZF)=0) (P6+)
CMOVAE/CMOVNB Пересылка, если не ниже (CF=0) (P6+)
CMOVB/CMOVNAE Пересылка, если ниже (CF=1) (P6+)
CMOVBE/CMOVNA Пересылка, если не выше ((CF ИЛИ ZF)=1) (P6+)
CMOVC Пересылка, если перенос (CF=1) (P6+)
CMOVE/CMOVZ Пересылка, если равно (ZF=1) (P6+)
CMOVG/CMOVNLE Пересылка, если больше (SF=(0F И ZF)) (P6+)
CMOVGE/CMOVNL Пересылка, если больше или равно (SF=0F) (P6+)
CMOVL/CMOVNGE Пересылка, если меньше (ZF0F) (P6+)
CMOVLE/CMOVNG Пересылка, если меньше или равно (SF0F или ZF=0) (P6+)
CMOVNC Пересылка, если нет переноса (CF=0) (P6+)
CMOVNE/CMOVNZ Пересылка, если не равно (ZF=0) (P6+)
CMOVNO Пересылка, если нет переполнения (0F=0) (P6+)
CMOVNP/CMOVPO Пересылка, если нет паритета (нечетность) (P6+)
CMOVNS Пересылка, если неотрицательно (SF=0) (P6+)
CMOVO Пересылка, если переполнение (0F=1) (P6+)
CMOVP/CMOVPE Пересылка, если паритет (четность) (Р6+)
CMOVS Пересылка, если отрицательно (SF=1)(P6+)
CMPXCHG r/in,r Обмен по результату сравнения байта, слова или двойного слова (486+)
CMPXCHG8B m64 Обмен по результату сравнения учетверенного слова (5+)
CWD/CDQ Преобразование слова АХ в двойное слово DX:AX (расширение знака, DX заполняется битом АХ. 15) или двойного слова ЕАХ в учетверенное EDX:EAX
IN Ввод из порта ввода-вывода в AL/(E)AX
MOV Пересылка(копирование)данных
MOVSX Копирование байта/слова со знаковым расширением до слова/ двойного слова(386+)
MOVZX Копирование байта/слова с нулевым расширением до слова/ двойного слова(386+)
OUT Вывод в порт из AL/(E)AX
POP Извлечение слова данных из стека в регистр или память, (E)SP инкрементируется
POPA(POPAll) Извлечение данных из стека в регистры Dl, SI, ВР, ВХ, DX, CX, AX (286+)
POPAD Извлечение данных из стека в регистры EDI, ESI, ЕВР, ЕВХ, EDX, ЕСХ, ЕАХ (386+)
PUSH Помещение слова из регистра или памяти в стек после декремента (E)SP
PUSHA (PUSH All) Помещение в стек регистров АХ, CX, DX, BX, SP (исходное значение), ВР, SI, Dl (286+)
PUSHAD Помещение в стек регистров ЕАХ, ЕСХ, EDX, ЕВХ, ESP (исходное значение), ЕВР, ESI, EDI (386+)
XCHG Обмен данными (взаимный) между регистрами или регистром и памятью
Инструкции ввода-вывода позволяют пересылать как одиночный бант или слово между портом и регистром процессора (инструкции IN и OUT), так и блок байт (слов) между портом и группой смежных ячеек памяти (инструкции INSB/INSW и OUTSB/OUTSW с префиксом повтора, см. ниже). Непосредственная адресация порта в команде обеспечивает доступ только к первым 256 адресам портов, косвенная (через регистр DX) — ко всему пространству ввода-вывода (64 Кбайт). Разрядность операнда и адрес должны согласовываться с физическими возможностями и особенностями поведения адресуемого устройства. При работе с памятью такие нюансы во внимание принимать обычно не приходится.
Инструкции двоичной арифметики выполняют все арифметические действия с байтами, словами и двойными словами, кодирующими знаковые или беззнаковые целые числа. Умножение и деление для 8086 возможны только с аккумулятором, результат для 16-битных операндов расширяется в регистре DX.
Для 286+ возможно двух- и трехадресное умножение с расширенном тилько в старший байт (два байта для 386+).
Таблица. Инструкции двоичной арифметики
Инструкция Описание
ADC Сложение двух операндов с учетом переноса от предыдущей операции
ADD Сложение двух операндов
СМР Сравнение (вычитание без сохранения результата — установка флагов)
DEC Декремент (вычитание 1, но не действует на флаг CF)
DIV Деление беззнаковое
IDIV Деление знаковое
IMUL Умножение знаковое
INC Инкремент (сложение с 1, но не действует на флаг CF)
MUL Беззнаковое умножение
NEG Изменение знака операнда
SBB Вычитание с заемом
SUB Вычитание
XADD Обмен содержимым и сложение (486+)
Инструкции десятичной арифметики являются дополнением к предыдущим. Они позволяют оперировать с неупакованными (биты [7:4] = 0, биты [3:0] содержат десятичную цифру 0-9) или упакованными (биты [7:4] содержат старшую, биты [3:0] — младшую десятичную цифру 0-9) двоичнодесятичными числами. Арифметические операции над этими числами требуют применения инструкций коррекции форматов.
Таблица. Инструкции десятичной арифметики
Инструкция Описание
ААА Десятичная коррекция после сложения двух неупакованных чисел
AAD Десятичная коррекция перед делением неупакованного двузначного числа
ААМ Десятичная коррекция после умножения двух неупакованных чисел
AAS Десятичная коррекция после вычитания двух неупакованных чисел
DAA Десятичная коррекция AL после сложения двух упакованных чисел
DAS Десятичная коррекция AL после вычитания двух упакованных чисел
Инструкции AAD и ААМ допускают обобщенный формат вызова, при котором коррекция выполняется но любому модулю (а не только по модулю 10).
Инструкции логических операций выполняют все функции булевой алгебры над байтами, словами или двойными словами.
Таблица. Инструкции логических операций
Инструкция Описание
AND Логическое И
NOT Инверсия (переключение всех бит)
OR Логическое ИЛИ
XOR Исключающее ИЛИ
Сдвиги и вращения (циклические сдвиги) выполняются над регистром или операндом в памяти. Число позиций, на которое производится сдвиг, берется непосредственно из операнда или регистра CL по модулю 8 для однобайтного операнда и по модулю 16 или 32 для операнда-слова, в зависимости от разрядности данных (32 только для 386+). Биты, выталкиваемые при сдвигах, попадают во флаг CF. При сдвигах влево и простом сдвиге вправо освобождающиеся биты заполняются нулями (инструкции SAL и SHL — синонимы). При арифметическом сдвиге вправо старший бит (знак) сохраняет свое значение. При циклических сдвигах выталкиваемые биты попадают и во флаг CF, и в освобождающиеся позиции. В сдвигах могут участвовать и два операнда (инструкции SHLD и SHRD).
Таблица. Инструкции сдвигов
Инструкция Описание
RCL Циклический сдвиг влево через бит переноса
RCR Циклический сдвиг вправо через бит переноса
ROL Циклический сдвиг влево
ROR Циклический сдвиг вправо
SAL Сдвиг арифметический влево
SAR Сдвиг арифметический (с сохранением старшего бита) вправо
SHL Сдвиг влево
SHR Сдвиг вправо
SHLD Сдвиг влево и вставка данных в освободившиеся позиции (386+)
SHRD Сдвиг вправо и вставка данных в освободившиеся позиции (386+)
Инструкции обработки бит и байт позволяют проверять (копировать в CF) и устанавливать значение указанного операнда, а также искать установленный бит. Битовые операции выполняются над 16-или 32-битным словом памяти или регистром. Инструкции BSF, BSR и ВТ не изменяют значения слова; ВТС, BTR и BTS воздействуют на указанный бит слова. Номер интересующего бита берется из операнда по модулю 16 или 32, в зависимости от разрядности.
Операции с байтами обеспечивают условную установку значений 00h или 01h. Инструкция тестирования может выполняться над байтом, словом или двойным словом.
Таблица. Инструкции обработки бит и байт
Инструкция Описание
BSF Сканирование бит (поиск единичного) вперед
BSR Сканирование бит назад
ВТ Тестирование бита (загрузка в CF)
ВТС Тестирование и изменения значения бита
BTR Тестирование и сброс бита
BTS Тестирование и установка бита
SALC Условная (по CF) установка А1 в FFh или OOh (не документировано, код D6h)
SETA/ Установка байта в 01h, если выше ((CF ИЛИ ZF)=0), иначе в 00h
SETNBE
SETAE/ Установка байта в 01 h, если не ниже (CF=0), иначе в 00h
SETNB/
SETNC
SETB/ Установка байта в 01h, если ниже (CF=1), иначе в 00h
SETNAE/
SETC
SETBE/ Установка байта в 01h, если не выше (CF ИЛИ ZF)=1, иначе в 00h
SETNA
SETE/ Установка байта в 01h, если равно (ZF=1), иначе в 00h
SETZ
SETG/ Установка байта в 01 h, если больше (SF=(OP И ZF)), иначе в 00h
SETNLE
SETQE/ Установка байта в 01h, если больше или равно (SF=OF), иначе в 00h
SETNL
SETL/ Установка байта в 01h, если меньше (ZF
OF), иначе в 00hSETNGE 00h
SETLE/ Установка байта в 01h, если меньше или равно (SF
0F или ZF=0),иначе в 00hSETNG
SETNE/ Установка байта в 01h, если не равно (ZF=0), иначе в 00h
SETNZ
SETNO Установка байта в 01h, если нет переполнения (0F=0), иначе в 00h
SETNS Установка байта в 01 h, если неотрицательно (SF=0), иначе в 00h
SETO Установка байта в 01h, если переполнение (0F=1), иначе в 00h
SETPE/ Установка байта в 01h, если паритет (четность), иначе в 00h
SETP
SETPO/ Установка байта в 01 h, если нет паритета (нечетность), иначе в 00h
SETNP
SETS Установка байта в 01 h, если отрицательно (SF=1), иначе в 00h
SETC Установка байта в 01 h, если перенос (CF=1), иначе в 00h
SETNC Установка байта в 01 h, если нет переноса (CF=0), иначе в 00h
TEST Проверка бит (логическое И без записи результата — установка флагов)
Строковые операции выполняются с операндами в памяти, адресуемыми регистрами DS:SI (DS:ESI) для источника и ES:DI (ES:EDI) для приемника. Операции могут использоваться с префиксами условного или безусловного повтора. После каждой пересылки или сравнения индексные регистры (SI, DI или оба) участвующих операндов автоматически инкрементируются или декрементируются на количество байт, участвующих в операции (1,2 или 4). Направление модификации определяется флагом DF: DF = 0 -инкремент, DF = 1 — декремент. Строковые инструкции ввода-вывода с префиксами повтора позволяют достигать высоких скоростей обмена с портами при условии полной загрузки процессора.
Таблица. Инструкции строковых операций
Инструкция Описание
CMPSB, CMPSD, CMPSW Сравнение строк байт, слов или двойных слов с записью результата сравнения в регистр флагов