Система команд микропроцессора 8086
Приложение Б.
СИСТЕМА КОМАНД МИКРОПРОЦЕССОРА 8086 ( 1978г. 16-ти разрядный с памятью 1Мб )
Ниже приведен список наиболее употребительных команд, который может выполнить роль справочной таблицы.
Напомним введенные в гл.3 обозначения для операндов команд на примере команды MOV. Пробел отделяет мнемокод команды от его первого операнда; запятая разделяет первый и второй операнды. Добавим символ | (вертикальная черта), имеющий смысл или одно, или другое; а символы B(byte) | W(word) указывают на возможные типы операндов (либо оба размером байт, либо оба размером слово).
r – любой регистр, кроме сегментного ( а именно, AH, AL, BH, BL, CH, CL, DH, DL – r8;
AX, BX, CX, DX, SI, DI, BP, SP – r16 ).
SR – сегментный регистр ( CS, SS, DS. ES ).
Если далее для операнда указан тип только W, то r16 вместо r служит для усиления этого факта.
i – непосредственный операнд (immediate), задаваемый в самой команде.
m (memory) – адресное выражение (например, X, [BX], X[bx], …).
Для команды MOV выписаны четыре строки. Две первых и две следующих для выделения особенностей работы с сегментными регистрами. Первая и вторая строки для подчеркивания факта недопустимости одновременого указания двух операндов из памяти.
Использавание m16 вместо m аналогично r16. Если используется обозначение m32, то имеется ввиду адрес двойного слова памяти.
1 КОМАНДЫ ПЕРЕСЫЛОК
─────────────────────────────────────────────────────────────────────────────────
Формат: КОП op1, op2 ( или КОП op или КОП ) Действие: op1 := op2 ( основное )
─────────────────────────────────────────────────────────────────────────────────
MOV r, i|r|m B|W Пересылка значения операнда op2 в op1 с43
MOV m, i|r B|W Пересылка значения операнда op2 в op1 с43
MOV r|m, SR W Пересылка значения сегментного регистра SR в op1 c43
MOV SR, r|m W Пересылка значения op2 в сегментный регистр SR, но не в CS с43
XCHG r, r|m B|W Обмен содержимым между операндами op1 и op2 c47
XCHG m, r B|W Обмен содержимым между операндами op1 и op2 c47
PUSH r16|m16 W Загрузка содержимого операнда op в стек с143
PUSH SR W Загрузка значения сегментного регистра SR в стек с143
PUSHF W Загрузка содержимого регистра FLAGS в стек с145
POP r16|m16 W Пересылка слова из стека в регистр или по исполнительному адресу c144
POP SR W Пересылка слова из стека в сегментный регистр SR ( кроме CS ) c144
POPF W Пересылка слова из стека в регистр FLAGS флагов с145
LEA r16, m16 W Загрузка в регистр op1 вычисленного исполнительного адреса op2 c91
LDS r16, m32 D Загрузка содержимого двойного слова в r16:= [m32] и DS := [m32+2] c178
LES r16, m32 D Загрузка содержимого двойного слова в r16:= [m32] и ES := [m32+2] с178
─────────────────────────────────────────────────────────────────────────────────
В командах MOV, XCHG операнды должны быть одинакового! размера и не быть вида память-память ( не m, m ).
Команды пересылок не меняют флаги, кроме команды POPF.
Запись слова в стек происходит так: сначала значение регистра SP уменьшается на 2 (сдвигается вверх), затем в свободную ячейку стека идет запись. Считывание слова из стека: верхнее слово, на которое указывает SS:SP, пересылается в операнд и значение регистра SP увеличивается на 2 (сдвигается вниз). Отметим, что вычисление SP ± 2 происходит по модулю 216 .
2 АРИФМЕТИЧЕСКИЕ команды.
─────────────────────────────────────────────────────────────────────────────────
ADD r, i|r|m B|W Сложение op1:= op1 + op2 с50
ADD m, i|r B|W Сложение op1:= op1 + op2 с50
SUB r, i|r|m B|W Вычитание op1:= op1 – op2 с50
SUB m, i|r B|W Вычитание op1:= op1 – op2 с50
ADC r, i|r|m B|W Сложение с учетом предыдущего CF op1:= op1 + op2 + CF с51
ADC m, i|r B|W Сложение с учетом предыдущего CF op1:= op1 + op2 + CF с51
SBB r, i|r|m B|W Вычитание с учетом предыдущего CF op1:= op1 – op2 – CF с51
SBB m, i|r B|W Вычитание с учетом предыдущего CF op1:= op1 – op2 – CF с51
CMP r, i|r|m B|W Сравнение операндов, аналог SUB без сохранения результата в op1 c67
CMP m, i|r B|W Сравнение операндов, аналог SUB без сохранения результата в op1 c67
INC r|m B|W Увеличение значения операнда op на 1 с51
DEC r|m B|W Уменьшение значения операнда op на 1 с51
NEG r|m B|W Изменение значения операнда op на противоположное с51
MUL r|m B|W Умножение беззнаковое значения регистра AL ( или регистра AX) на значение op в команде;
результат в регистре AX ( или в регистрах <DX, AX> ) c53
IMUL r|m B|W Умножение знаковое значения регистра AL ( или регистра AX) на значение op, указанного в команде c53
результат в регистре AX ( или в регистрах <DX, AX> ) c53
DIV r|m B|W Деление беззнаковое значения в регистре AX ( или в регистрах <DX, AX> ) на значение op, указанного
в команде; результаты в регистрах AH:= mod ( или в DX:= mod ) и AL:= div ( или AX:= div ) с55
IDIV r|m B|W Деление знаковое значения в регистре AX ( или в регистрах <DX, AX> ) на значение op, указанного
в команде; результаты в регистрах AH:= mod ( или в DX:= mod ) и AL:= div ( или AX:= div ) с55
CBW Преобразование значения знакового байта, находящегося в AL, в слово-результат в регистре AX с57
CWD Преобразование значения знакового слова, находящегося в AX, в двойное слово – <DX, AX> с58
─────────────────────────────────────────────────────────────────────────────────
В командах ADD, SUB, ADC, SBB, CMP операнды должны быть одинакового! размера и не быть вида память-память ( m, m ). По этим командам устанавлива-ются все флаги (с49). Команды INC, DEC меняют все флаги, кроме CF. По команде NEG операнд не меняется в особых случаях при op= –128 (80h) и op= –32768 (8000h) при этом OF=1, в остальных случаях OF=0; при нулевом операнде CF=0, иначе =1; флаги SF и ZF меняются как обычно. По командам умножения CF и OF устанавливаются синхронно так: если произведение не превосходит размера сомножителей, то в 0, иначе в 1 (с54).
3 ЛОГИЧЕСКИЕ команды и команды СДВИГА ( выполняются поразрядно ).
─────────────────────────────────────────────────────────────────────────────────
NOT r|m B|W Поразрядное инвертирование каждого бита операнда op с104
AND r, i|r|m B|W Логическое умножение (конъюнкция) поразрядное op1:= op1 and op2 c104
AND m, i|r B|W Логическое умножение (конъюнкция) поразрядное op1:= op1 and op2 c104
TEST r, i|r|m B|W Логическое умножение and без сохранения результата в op1 c105
TEST m, i|r B|W Логическое умножение and без сохранения результата в op1 c105
OR r, i|r|m B|W Логическое сложение (дизъюнкция) поразрядное op1:= op1 or op2 c105
OR m, i|r B|W Логическое сложение (дизъюнкция) поразрядное op1:= op1 or op2 c105
XOR r, i|r|m B|W Исключающее или op1:= op1 xor op2 : i-й бит результата равен нулю, если i-е биты операндов
XOR m, i|r B|W совпдают и i-й бит результата равен 1, если i-е биты операндов различны (сложение по mod 2).
Логические команды меняют все флаги; но после них обычно используется флаг нуля ZF; ZF= 1, если результат нулевой
во всех разрядах и ZF= 0, если в результате есть хоть одна двоичная единица. с106
Каждая команда сдвига имеет две разновидности <мнемокод> op, 1 или <мнемокод> op, CL; второй операнд рассматривается как целое без знака и определяет на сколько разрядов сдвигать; слова сдвигаются так, как если бы они в памяти хранились в непере-вернутом виде. Результат сдвига записывается на место первого операнда. Команды сдвига меняют все флаги; но используется CF.
Далее в CF заносится значение "уходящего" бита, а с другого конца добавляется 0.
SHR/SHL r|m, 1 B|W Логический сдвиг op1 вправо/влево на 1 разряд с108
SHR/SHL r|m, CL B|W Логический сдвиг op1 вправо/влево на содержимое байтового регистра CL с108
( SAL=другое название команды SHL )
SAR r|m, 1 B|W Арифметический сдвиг op1 вправо на 1 разряд и знаковый разряд восстанавливается с110
SAR r|m, CL B|W Арифметический сдвиг op1 вправо на CL разрядов и знаковый разряд восстанавливается с110
Далее попрежнему в CF заносится значение "уходящего" бита и в освобождающийся бит добавляется он же!
ROR/ROL r|m, 1 B|W Циклический сдвиг op1 вправо/влево на 1 разряд с110
ROR/ROL r|m, CL B|W Циклический сдвиг op1 вправо/влево на CL разрядов с111
Далее в CF заносится значение "уходящего" бита, но прежде старое значение CF заносится в освобождающийся бит. с111
RCR/RCL r|m, 1 B|W Циклический сдвиг через перенос op1 вправо/влево на 1 разряд с111
RCR/RCL r|m, CL B|W Циклический сдвиг через перенос op1 вправо/влево на CL разрядов с111
Быстрое умножение, деление и остаток от деления ( сс109,115). Особенности деления отрицательных чисел с110.
4 КОМАНДЫ УПРАВЛЕНИЯ ( основные, наиболее употребительные варианты )
─────────────────────────────────────────────────────────────────────────────────
Формат: КОП op или КОП (не меняют флаги! ).
─────────────────────────────────────────────────────────────────────────────────
Безусловные близкие (внутрисегментные– меняется только регистр счетчика адреса IP ).
JMP <метка> Переход прямой ( длинный или при наличии short короткий ) сс63-65
JMP r16 | m16 W Переход косвенный (длинный) по адресу, содержащемуся в операнде сс34,66, 67
JMP word ptr r16 | m16 или… в случае ссылки вперед сс66, 67,152
Безусловные дальние (межсегментные– устанавливаются оба регистра и IP, и CS ).
JMP far ptr <метка> Переход прямой ( всегда с far ptr, т. к. дальний ) с152
JMP m32 DD Переход косвенный ( X dd L ; X+0 – ofs L, X+2 – seg L ) c151
JMP dword ptr m32 или… в случае ссылки вперед с152
CALL <имя процедуры> Вызов процедуры (переход с возратом: запись в стек адреса следующей команды и
передача управления на первую команду процедуры) с155
CALL far ptr <имя процедуры> или… в случае ссылки вперед с156
RET [ 0 ] Возврат из процедуры (считывание из вершины стека адреса и переход по нему с155
RET i16 Возврат из подпрограммы (после извлечения из стека адреса возврата, увеличивается
значение регистра SP на число байтов, равное беззнаковому значению i16, затем передается управление по адресу возврата) с163
Условные близкие (внутрисегментные) все прямые короткие.
Jxx <метка> Условный переход см. далее (на следующем листе уточнения) с68
LOOP <метка> CX := CX–1; переход по адресу adr8, если CX <> 0 с71
LOOPE/Z <метка> CX := CX–1; переход по адресу adr8, если CX<>0 и ZF=1 с73
LOOPNE/NZ <метка> CX := CX–1; переход по адресу adr8, если CX<>0 и ZF=0 с74
JCXZ <метка> Переход по адресу adr8, если CX=0 с69
IP и CS – регистры центрального процессора, задают адрес команды, которая должна выполнится следующей. Короткий переход "adr8" – адрес перехода в пределах области текущего сегмента, ограниченный 128-байтовым "расстоянием" ( Î [ –128, +127 ] ) от команды перехода. с 64
NEAR и FAR – стандартные знаковые константы со значениями –1 и –2. с152
Type <метка> или type <имя процедуры> имеют эти значения: NEAR и FAR.
4a УСЛОВИЯ перехода в командах вида Jxx <метка>
Мнемокод Переход, если условие Значения флагов
─────────────────────────────────────────────────────────────────────────────────
Переходы после команды сравнения для знаковых чисел. с68
JL/JNGE < меньше/не больше и не равно SF<>OF
JGE/JNL ≥ больше или равно/не меньше SF = OF
JLE/JNG £ меньше или равно/не больше (SF<>OF) or (ZF=1)
JG/JNLE > больше/не меньше и не равно (SF=OF) and (ZF=0)
Переходы после команды сравнения для беззнаковых чисел. с68
JB/JNAE < меньше/не больше и не равно CF=1
JAE/JNB ≥ больше или равно/не меньше CF=0
JBE/JNA £ меньше или равно/не больше (CF=1) or (ZF=1)
JA/JNBE > больше/не меньше и не равно (CF=0) and (ZF=0)
Переходы после команд, устанавливающих тот или иной флаг Значение флага с69
JE/JZ = результат равен нулю ZF=1
JNE/JNZ ≠ результат не равен нулю ZF=0
JC/JNC есть/нет перенос CF=1 / 0
JO/JNO есть/нет переполнение OF=1 / 0
JS/JNS отрицатательный/положительный результат SF=1 / 0
─────────────────────────────────────────────────────────────────────────────────
Для всех этих команд реализован один формат – близкий прямой короткий относительный переход.
Переход короткий описан выше. (с64 следует учитывать при программировании)
Переход прямой, т. к. в качестве операнда указывается метка команды, которой надо передать управление.
Переход относительный потому, что в машинной команде указывается не сам адрес, а разность между командой перехода и адресом перехода (адрес, точнее разность вместо метки подставит сам ассемблер ).
JB/JNAE/ JC – одна машинная команда, аналогично JAE/JNB/ JNC – одна машинная команда.
5 МАКРОКОМАНДЫ ВВОДА/ВЫВОДА.
INCH r8|m8 B ввод символа (его кода) в байтовый операнд: регистр или память с75
OUTCH i8|r8|m8 B вывод символа (без кавычек) c76
ININT r16|m16 W ввод целого десятичного числа (если число внутри допустимого диапазона, иначе ошибка) с75
OUTINT i16|r16|m16 W вывод десятичного числа со знаком размером в слово c77
OUTINT i16|r16|m16, leng W вывод десятичного числа со знаком размером в слово в формате:
второй операнд leng типа byte i8|r8|m8 (со значением ≥ 0) задает ширину поля вывода c77
OUTWORD i16|r16|m16 W вывод десятичного числа без знака размером в слово c77
OUTWORD i16|r16|m16, leng W вывод десятичного числа без знака размером в слово в формате:
второй операнд leng типа byte i8|r8|m8 (со значением ≥ 0) задает ширину поля вывода c77
OUTSTR вывод строки символов: сс76,91
DS:DX – адрес начала строки; в конце строки знак $ (код символа 36=24h)
NEWLINE перевод строки с76
FINISH останов с75
Для inch допускается набор сразу нескольких символов (до Enter, Backspace-отмена последнего символа, Esc-отмена всего текста)
Операнд i8 в outch – это код символа, или символ в кавычках; получаем символ без кавычек в результате.
Особенности ввода числа по inint: число начинается знаком или цифрой, все пробелы и концы строк до пропускаются, ввод идет до первой нецифры, в том числе Enter (он глотается); можно набрать несколько чисел для ввода в цикле, допускается редактирование при наборе.
Особенности вывода числа по outint ( аналогично для outword): если ширина поля вывода больше, чем надо, то слева добавляются пробелы; если меньше – выводится только число.
6 КОМАНДЫ ОБРАБОТКИ СТРОК И БЛОКОВ ДАННЫХ
─────────────────────────────────────────────────────────────────────────────────
Формат: КОП ; операнды выбираются по умолчению
src (source) источник DS:SI "откуда" dst (destination) приёмник ES:DI "куда".
─────────────────────────────────────────────────────────────────────────────────
CLD (clear) установить флаг DF:=0 или STD (set) установить флаг DF:=1 с170
MOVSB | W Пересылка значения элемента строки из src по адресу строки dst c176
CMPSB | W Сравнение значения элемента строки src со значением элемента строки dst
Установка флагов условий по результату операции c169
SCASB | W Сравнение содержимого srt=AL|AX со значением элемента строки dst
Установка флагов условий по результату операции c175
LODSB | W Пересылка значения элемента строки src в регистр AL|AX c177
STOSB | W Пересылка содержимого регистра AL|AX по адресу dst строки c176
REP <строковая команда> Выполнение строковой команды CX раз c171
REPE <строковая команда> Повторяй, пока равны, но не более CX раз. с171
if CX=0 then goto L1; ZF:=1; L: CX:=CX–1; <строковая команда>
if (ZF:=1)and(CX<>0) then goto L; L1:
REPNE <строковая команда> Повторяй, пока не равны, но не более CX раз. с174
if CX=0 then goto L1; ZF:=0; L: CX:=CX–1; <строковая команда>
if (ZF:=0)and(CX<>0) then goto L; L1:
Все строковые команды имеют две модификации, которые отличаются только размером операнда байт или слово (B | W).
MOVSB | W и CMPSB | W являются командами формата память-память ( m8 | m16 ).
Строковые команды CMPSB|W и SCASB | W устанавливают регистр флагов.
Команда префикс REPE имеет другое название синоним REPZ, аналогично REPNE/REPNZ