Учебные материалы по математике | Система команд микропроцессора 8086 | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Система команд микропроцессора 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

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020