Микропроцессор 8086 поддерживает 8 типов инструкций —
- Инструкция по передаче данных
- Арифметические инструкции
- Инструкции по управлению битами
- Строковые Инструкции
- Инструкции по переносу выполнения программы (инструкции по ветвлению и петле)
- Инструкция по управлению процессором
- Инструкции по контролю итерации
- Инструкции по прерыванию
Давайте теперь обсудим эти наборы команд в деталях.
Инструкция по передаче данных
Эти инструкции используются для передачи данных из исходного операнда в целевой операнд. Ниже приведен список инструкций в этой группе —
Инструкция по переводу слова
-
MOV — используется для копирования байта или слова из предоставленного источника в указанное место назначения.
-
PPUSH — используется для размещения слова в верхней части стека.
-
POP — используется для получения слова с вершины стека в указанное место.
-
PUSHA — используется для помещения всех регистров в стек.
-
POPA — используется для получения слов из стека во все регистры.
-
XCHG — используется для обмена данными из двух мест.
-
XLAT — используется для перевода байта в AL с использованием таблицы в памяти.
MOV — используется для копирования байта или слова из предоставленного источника в указанное место назначения.
PPUSH — используется для размещения слова в верхней части стека.
POP — используется для получения слова с вершины стека в указанное место.
PUSHA — используется для помещения всех регистров в стек.
POPA — используется для получения слов из стека во все регистры.
XCHG — используется для обмена данными из двух мест.
XLAT — используется для перевода байта в AL с использованием таблицы в памяти.
Инструкция по переносу портов ввода и вывода
-
IN — используется для чтения байта или слова из предоставленного порта в аккумулятор.
-
OUT — используется для отправки байта или слова из аккумулятора в указанный порт.
IN — используется для чтения байта или слова из предоставленного порта в аккумулятор.
OUT — используется для отправки байта или слова из аккумулятора в указанный порт.
Инструкция по переводу адреса
-
LEA — используется для загрузки адреса операнда в предоставленный регистр.
-
LDS — используется для загрузки регистра DS и другого предоставленного регистра из памяти
-
LES — используется для загрузки регистра ES и другого предоставленного регистра из памяти.
LEA — используется для загрузки адреса операнда в предоставленный регистр.
LDS — используется для загрузки регистра DS и другого предоставленного регистра из памяти
LES — используется для загрузки регистра ES и другого предоставленного регистра из памяти.
Инструкция по передаче флаговых регистров
-
LAHF — используется для загрузки AH младшим байтом регистра флага.
-
SAHF — используется для сохранения регистра AH в младший байт регистра флага.
-
PUSHF — используется для копирования регистра флага в верхней части стека.
-
POPF — используется для копирования слова из верхней части стека в регистр флага.
LAHF — используется для загрузки AH младшим байтом регистра флага.
SAHF — используется для сохранения регистра AH в младший байт регистра флага.
PUSHF — используется для копирования регистра флага в верхней части стека.
POPF — используется для копирования слова из верхней части стека в регистр флага.
Арифметические инструкции
Эти инструкции используются для выполнения арифметических операций, таких как сложение, вычитание, умножение, деление и т. Д.
Ниже приведен список инструкций в этой группе —
Инструкция по выполнению сложения
-
ДОБАВИТЬ — Используется для добавления предоставленного байта в байт / слово в слово.
-
ADC — используется для добавления с переносом.
-
INC — используется для увеличения предоставленного байта / слова на 1.
-
AAA — Используется для настройки ASCII после добавления.
-
DAA — используется для настройки десятичной дроби после операции сложения / вычитания.
ДОБАВИТЬ — Используется для добавления предоставленного байта в байт / слово в слово.
ADC — используется для добавления с переносом.
INC — используется для увеличения предоставленного байта / слова на 1.
AAA — Используется для настройки ASCII после добавления.
DAA — используется для настройки десятичной дроби после операции сложения / вычитания.
Инструкция по выполнению вычитания
-
SUB — Используется для вычитания байта из байта / слова из слова.
-
SBB — Используется для вычитания с заимствованием.
-
DEC — используется для уменьшения предоставленного байта / слова на 1.
-
NPG — Используется для отрицания каждого бита предоставленного байта / слова и добавления дополнения 1/2.
-
CMP — используется для сравнения 2 предоставленных байтов / слов.
-
AAS — Используется для настройки кодов ASCII после вычитания.
-
DAS — используется для настройки десятичной дроби после вычитания.
SUB — Используется для вычитания байта из байта / слова из слова.
SBB — Используется для вычитания с заимствованием.
DEC — используется для уменьшения предоставленного байта / слова на 1.
NPG — Используется для отрицания каждого бита предоставленного байта / слова и добавления дополнения 1/2.
CMP — используется для сравнения 2 предоставленных байтов / слов.
AAS — Используется для настройки кодов ASCII после вычитания.
DAS — используется для настройки десятичной дроби после вычитания.
Инструкция по выполнению умножения
-
MUL — используется для умножения байта без знака на слово / слово за словом.
-
IMUL — используется для умножения подписанного байта за байтом / слово за словом.
-
AAM — используется для настройки кодов ASCII после умножения.
MUL — используется для умножения байта без знака на слово / слово за словом.
IMUL — используется для умножения подписанного байта за байтом / слово за словом.
AAM — используется для настройки кодов ASCII после умножения.
Инструкция по выполнению деления
-
DIV — Используется для деления беззнакового слова по байту или без знака двойного слова по слову.
-
IDIV — Используется для деления подписанного слова в байтах или подписанного двойного слова в слово.
-
AAD — используется для настройки кодов ASCII после деления.
-
CBW — используется для заполнения старшего байта слова копиями знакового бита младшего байта.
-
CWD — используется для заполнения верхнего слова двойного слова знаковым битом нижнего слова.
DIV — Используется для деления беззнакового слова по байту или без знака двойного слова по слову.
IDIV — Используется для деления подписанного слова в байтах или подписанного двойного слова в слово.
AAD — используется для настройки кодов ASCII после деления.
CBW — используется для заполнения старшего байта слова копиями знакового бита младшего байта.
CWD — используется для заполнения верхнего слова двойного слова знаковым битом нижнего слова.
Инструкции по управлению битами
Эти инструкции используются для выполнения операций, в которых задействованы биты данных, например, таких как логические операции, сдвиг и т. Д.
Ниже приведен список инструкций в этой группе —
Инструкция по выполнению логической операции
-
НЕ — используется для инвертирования каждого бита или слова.
-
И — Используется для добавления каждого бита в байте / слове с соответствующим битом в другом байте / слове.
-
ИЛИ — Используется для умножения каждого бита в байте / слове на соответствующий бит в другом байте / слове.
-
XOR — используется для выполнения операции Exclusive-OR над каждым битом в байте / слове с соответствующим битом в другом байте / слове.
-
TEST — используется для добавления операндов для обновления флагов, без влияния на операнды.
НЕ — используется для инвертирования каждого бита или слова.
И — Используется для добавления каждого бита в байте / слове с соответствующим битом в другом байте / слове.
ИЛИ — Используется для умножения каждого бита в байте / слове на соответствующий бит в другом байте / слове.
XOR — используется для выполнения операции Exclusive-OR над каждым битом в байте / слове с соответствующим битом в другом байте / слове.
TEST — используется для добавления операндов для обновления флагов, без влияния на операнды.
Инструкция по выполнению сменных операций
-
SHL / SAL — используется для сдвига битов байта / слова влево и установки нуля (S) в младших битах.
-
SHR — используется для сдвига битов байта / слова вправо и установки нуля (S) в старших битах.
-
SAR — используется для сдвига битов байта / слова вправо и копирования старого MSB в новый MSB.
SHL / SAL — используется для сдвига битов байта / слова влево и установки нуля (S) в младших битах.
SHR — используется для сдвига битов байта / слова вправо и установки нуля (S) в старших битах.
SAR — используется для сдвига битов байта / слова вправо и копирования старого MSB в новый MSB.
Инструкции для выполнения операций поворота
-
ROL — Используется для поворота битов байта / слова влево, то есть от MSB к LSB и к сигналу переноса [CF].
-
ROR — используется для поворота битов байта / слова вправо, то есть от LSB к MSB и к сигналу переноса [CF].
-
RCR — используется для поворота битов байта / слова вправо, то есть от LSB к CF и CF к MSB.
-
RCL — используется для поворота битов байта / слова влево, то есть от MSB к CF и от CF к LSB.
ROL — Используется для поворота битов байта / слова влево, то есть от MSB к LSB и к сигналу переноса [CF].
ROR — используется для поворота битов байта / слова вправо, то есть от LSB к MSB и к сигналу переноса [CF].
RCR — используется для поворота битов байта / слова вправо, то есть от LSB к CF и CF к MSB.
RCL — используется для поворота битов байта / слова влево, то есть от MSB к CF и от CF к LSB.
Строковые Инструкции
Строка — это группа байтов / слов, и их память всегда выделяется в последовательном порядке.
Ниже приведен список инструкций в этой группе —
-
REP — Используется для повторения данной инструкции до CX ≠ 0.
-
REPE / REPZ — Используется для повторения данной инструкции до тех пор, пока CX = 0 или нулевой флаг ZF = 1.
-
REPNE / REPNZ — используется для повторения данной инструкции до тех пор, пока CX = 0 или нулевой флаг ZF = 1.
-
MOVS / MOVSB / MOVSW — используется для перемещения байта / слова из одной строки в другую.
-
COMS / COMPSB / COMPSW — используется для сравнения двух строковых байтов / слов.
-
INS / INSB / INSW — используется в качестве входной строки / байта / слова из порта ввода-вывода в указанное место памяти.
-
OUTS / OUTSB / OUTSW — используется в качестве выходной строки / байта / слова из предоставленной ячейки памяти в порт ввода / вывода.
-
SCAS / SCASB / SCASW — Используется для сканирования строки и сравнения ее байта с байтом в AL или слова строки со словом в AX.
-
LODS / LODSB / LODSW — используется для сохранения байта строки в AL или слова строки в AX.
REP — Используется для повторения данной инструкции до CX ≠ 0.
REPE / REPZ — Используется для повторения данной инструкции до тех пор, пока CX = 0 или нулевой флаг ZF = 1.
REPNE / REPNZ — используется для повторения данной инструкции до тех пор, пока CX = 0 или нулевой флаг ZF = 1.
MOVS / MOVSB / MOVSW — используется для перемещения байта / слова из одной строки в другую.
COMS / COMPSB / COMPSW — используется для сравнения двух строковых байтов / слов.
INS / INSB / INSW — используется в качестве входной строки / байта / слова из порта ввода-вывода в указанное место памяти.
OUTS / OUTSB / OUTSW — используется в качестве выходной строки / байта / слова из предоставленной ячейки памяти в порт ввода / вывода.
SCAS / SCASB / SCASW — Используется для сканирования строки и сравнения ее байта с байтом в AL или слова строки со словом в AX.
LODS / LODSB / LODSW — используется для сохранения байта строки в AL или слова строки в AX.
Инструкции переноса выполнения программы (инструкции ветвления и петли)
Эти инструкции используются для передачи / ветвления команд во время исполнения. Он включает в себя следующие инструкции —
Инструкция по передаче инструкции во время исполнения без каких-либо условий —
-
CALL — используется для вызова процедуры и сохранения адреса возврата в стек.
-
RET — используется для возврата из процедуры в основную программу.
-
JMP — используется для перехода к указанному адресу для перехода к следующей инструкции.
CALL — используется для вызова процедуры и сохранения адреса возврата в стек.
RET — используется для возврата из процедуры в основную программу.
JMP — используется для перехода к указанному адресу для перехода к следующей инструкции.
Инструкция для передачи инструкции во время исполнения с некоторыми условиями —
-
JA / JNBE — Используется для перехода, если выполнено указание выше / не ниже / равно.
-
JAE / JNB — используется для перехода, если инструкция выше / не ниже удовлетворяет.
-
JBE / JNA — Используется для перехода, если инструкция ниже / равно / не выше удовлетворяет.
-
JC — используется для прыжка, если флаг переноса CF = 1
-
JE / JZ — используется для перехода, если равен / ноль флаг ZF = 1
-
JG / JNLE — используется для перехода, если инструкция больше / не меньше / равна.
-
JGE / JNL — используется для перехода, если выполнено больше / равно / не меньше, чем инструкция.
-
JL / JNGE — используется для перехода, если удовлетворяется инструкция меньше / не больше / равно.
-
JLE / JNG — используется для перехода, если выполнено меньше / равно / если не больше, чем инструкция.
-
JNC — используется для прыжка, если нет флага переноса (CF = 0)
-
JNE / JNZ — используется для перехода, если не равен / нулевой флаг ZF = 0
-
JNO — используется для перехода, если нет флага переполнения OF = 0
-
JNP / JPO — используется для перехода, если не четность / четность нечетная PF = 0
-
JNS — используется для прыжка, если не знак SF = 0
-
JO — используется для перехода, если флаг переполнения OF = 1
-
JP / JPE — используется для перехода, если четность / четность даже PF = 1
-
JS — Используется для перехода, если флаг знака SF = 1
JA / JNBE — Используется для перехода, если выполнено указание выше / не ниже / равно.
JAE / JNB — используется для перехода, если инструкция выше / не ниже удовлетворяет.
JBE / JNA — Используется для перехода, если инструкция ниже / равно / не выше удовлетворяет.
JC — используется для прыжка, если флаг переноса CF = 1
JE / JZ — используется для перехода, если равен / ноль флаг ZF = 1
JG / JNLE — используется для перехода, если инструкция больше / не меньше / равна.
JGE / JNL — используется для перехода, если выполнено больше / равно / не меньше, чем инструкция.
JL / JNGE — используется для перехода, если удовлетворяется инструкция меньше / не больше / равно.
JLE / JNG — используется для перехода, если выполнено меньше / равно / если не больше, чем инструкция.
JNC — используется для прыжка, если нет флага переноса (CF = 0)
JNE / JNZ — используется для перехода, если не равен / нулевой флаг ZF = 0
JNO — используется для перехода, если нет флага переполнения OF = 0
JNP / JPO — используется для перехода, если не четность / четность нечетная PF = 0
JNS — используется для прыжка, если не знак SF = 0
JO — используется для перехода, если флаг переполнения OF = 1
JP / JPE — используется для перехода, если четность / четность даже PF = 1
JS — Используется для перехода, если флаг знака SF = 1
Инструкция по управлению процессором
Эти инструкции используются для управления действиями процессора путем установки / сброса значений флага.
Ниже приведены инструкции в этой группе:
-
STC — используется для установки флага переноса CF на 1
-
CLC — используется для сброса / сброса флага переноса CF на 0
-
CMC — используется для установки дополнения в состоянии флага переноса CF.
-
STD — используется для установки флага направления DF на 1
-
CLD — используется для сброса / сброса флага направления DF на 0
-
STI — используется для установки флага разрешения прерывания на 1, т. Е. Для включения входа INTR.
-
CLI — используется для сброса флага разрешения прерываний на 0, т. Е. Для отключения входа INTR.
STC — используется для установки флага переноса CF на 1
CLC — используется для сброса / сброса флага переноса CF на 0
CMC — используется для установки дополнения в состоянии флага переноса CF.
STD — используется для установки флага направления DF на 1
CLD — используется для сброса / сброса флага направления DF на 0
STI — используется для установки флага разрешения прерывания на 1, т. Е. Для включения входа INTR.
CLI — используется для сброса флага разрешения прерываний на 0, т. Е. Для отключения входа INTR.
Инструкции по контролю итерации
Эти инструкции используются для выполнения данных инструкций несколько раз. Ниже приведен список инструкций в этой группе —
-
LOOP — используется для зацикливания группы команд до тех пор, пока условие не будет удовлетворено, то есть CX = 0
-
LOOPE / LOOPZ — используется для зацикливания группы команд до тех пор, пока она не удовлетворит ZF = 1 и CX = 0
-
LOOPNE / LOOPNZ — используется для зацикливания группы команд до тех пор, пока она не удовлетворит ZF = 0 и CX = 0
-
JCXZ — используется для перехода к указанному адресу, если CX = 0
LOOP — используется для зацикливания группы команд до тех пор, пока условие не будет удовлетворено, то есть CX = 0
LOOPE / LOOPZ — используется для зацикливания группы команд до тех пор, пока она не удовлетворит ZF = 1 и CX = 0
LOOPNE / LOOPNZ — используется для зацикливания группы команд до тех пор, пока она не удовлетворит ZF = 0 и CX = 0
JCXZ — используется для перехода к указанному адресу, если CX = 0
Инструкции по прерыванию
Эти инструкции используются для вызова прерывания во время выполнения программы.
INT — Используется для прерывания программы во время выполнения и вызова указанной службы.
INTO — используется для прерывания программы во время выполнения, если OF = 1
IRET — используется для возврата из службы прерываний в основную программу