- •Оглавление
- •Общие сведения
- •Среда выполнения программ
- •Представление информации
- •Двоичные числа без знака
- •Двоичные числа со знаком
- •Символьная информация
- •Двоично-десятичные числа
- •Адресация памяти
- •Физическая память
- •Сегментация
- •Регистры микропроцессора
- •Регистры общего назначения
- •Сегментные регистры
- •Регистр флагов
- •15 0
- •Указатель инструкции
- •Выполнение инструкций
- •Адресация операндов
- •Регистровые операнды
- •Операнды в памяти
- •Непосредственные операнды
- •Адреса переходов
- •Формат кода команды
- •Префиксы
- •Код операции
- •Байт ModRegR/m
- •7 6 5 4 3 2 1 0
- •Отклонение
- •Непосредственный операнд
- •Инициализация процессора
- •Прерывания
- •Источники и причины прерываний
- •Внешние прерывания
- •Немаскируемые прерывания
- •Маскируемые прерывания
- •Исключения
- •Прерывание по ошибке деления
- •Прерывание по точке останова
- •Прерывание по переполнению
- •Прерывание по трассировке
- •Программные прерывания
- •Обработка прерываний
- •Действия микропроцессора по обработке прерывания
- •Приоритет прерываний
- •Идентификация источников прерываний
- •Система команд
- •Машинные инструкции
- •Aaa– коррекция сложения двоично-десятичных распакованных чисел
- •Замечания по программированию
- •Aad– коррекция деления двоично-десятичных распакованных чисел
- •Замечания по программированию
- •Aam– коррекция умножения двоично-десятичных распакованных чисел
- •Замечания по программированию
- •Aas– коррекция вычитания двоично-десятичных распакованных чисел
- •Add– двоичное сложение без переноса
- •Замечания по программированию
- •Adc– двоичное сложение с переносом
- •Замечания по программированию
- •And– логическое и
- •Call– вызов процедуры
- •Cbw– преобразование байта в слово
- •Cmps– сравнение строк
- •Замечания по программированию
- •Cwd– преобразование слово в двойное слово
- •Daa– коррекция сложения двоично-десятичных упакованных чисел
- •Das– коррекция вычитания двоично-десятичных упакованных чисел
- •Dec– декремент
- •Замечания по программированию
- •Div– деление беззнаковое
- •Esc– команда сопроцессора
- •Замечания по программированию
- •Hlt– останов процессора
- •Idiv– деление знаковое
- •Imul– умножение знаковое
- •In– ввод информации из порта ввода-вывода
- •Inc– инкремент
- •Замечания по программированию
- •Jmp– безусловный переход
- •Lahf– загрузка флагов состояния в регистрAh
- •Lds– загрузка дальнего указателя для сегмента данных
- •Lea– загрузка эффективного адреса
- •Замечания по программированию
- •Les– загрузка дальнего указателя для дополнительного сегмента данных
- •Lods– загрузка строки
- •Замечания по программированию
- •Loop/looPcc– цикл по счётчику в регистреCx
- •Mov– пересылка
- •Movs– пересылка строк
- •Замечания по программированию
- •Mul– умножение беззнаковое
- •Neg– смена знака
- •Out– вывод информации из порта ввода-вывода
- •Pop– извлечение информации из стека
- •Замечания по программированию
- •Popf– загрузка регистра флагов из стека
- •Push– занесение информации в стек
- •Замечания по программированию
- •Pushf– запись регистра флагов в стек
- •Rcl– циклический сдвиг влево через флажок переноса
- •Замечания по программированию
- •Rcr– циклический сдвиг вправо через флажок переноса
- •Замечания по программированию
- •Ret– возврат из процедуры
- •Замечания по программированию
- •Rol– циклический сдвиг влево
- •Замечания по программированию
- •Ror– циклический сдвиг вправо
- •Замечания по программированию
- •Sahf– загрузкаAHв регистр флагов
- •Sal – арифметический сдвиг влево
- •Замечания по программированию
- •Sar– арифметический сдвиг вправо
- •Замечания по программированию
- •Sbb– двоичное вычитание с заёмом
- •Замечания по программированию
- •Scas– сканирование строки
- •Замечания по программированию
- •Shl – логический сдвиг влево
- •Замечания по программированию
- •Shr– логический сдвиг вправо
- •0 ─►│ Операнд ├──►│cf│
- •Замечания по программированию
- •Замечания по программированию
- •Sub– двоичное вычитание
- •Замечания по программированию
- •Test– логическое сравнение
- •Wait– ожидание сопроцессора
- •Замечания по программированию
- •Xchg– обмен информацией
- •Xlatb– табличная перекодировка
- •Xor– исключающее или
- •Префиксы машинных инструкций
- •Ds:/es:/ss:/cs:– префиксы замены сегмента
- •Lock– блокировка шины
- •Rep/rePcc– повторение строковой операции
- •Приложение 1. Коды операций
- •Приложение 2. Время выполнения команд
Pop– извлечение информации из стека
|
8F /0 |
POP m16 |
занесение данных из стека в m16 |
|
58+rw |
POP r16 |
занесение данных из стека в r16 |
|
1F |
POP DS |
занесение данных из стека в DS |
|
07 |
POP ES |
занесение данных из стека в ES |
|
17 |
POP SS |
занесение данных из стека в SS |
Описание.Эти инструкции извлекают из стека слово данных и заносят его в указанный операнд.
Слово извлекается из вершины стека, адрес которой находится в регистровой паре SS:SP. После извлечения слова содержимоеSPувеличивается на 2.
Флажкине изменяются.
Замечания по программированию
Выполнение инструкции POP SPприведёт к загрузке вSPслова из старой вершины стека, поскольку увеличениеSPна 2 производится после выборки слова из вершины стека, но до занесения этого слова в операнд инструкции.
Popf– загрузка регистра флагов из стека
|
9D |
POPF |
загрузка слова из вершины стека в регистр FLAGS |
Описание.Эта инструкция извлекает из стека слово данных и заносит его в регистрFLAGS.
Слово извлекается из вершины стека, адрес которой находится в регистровой паре SS:SP. После извлечения слова содержимоеSPувеличивается на 2.
Зарезервированные разряды регистра FLAGSне изменяются.
Флажкизагружаются из стека.
Push– занесение информации в стек
|
FF /6 |
PUSH r/m16 |
занесение данных в стек из r/m16 |
|
58+rw |
PUSH r16 |
занесение данных в стек из r16 |
|
06 |
PUSH ES |
занесение в стек ES |
|
0E |
PUSH CS |
занесение в стек CS |
|
16 |
PUSH SS |
занесение в стек SS |
|
1E |
PUSH DS |
занесение в стек DS |
Описание.Эти инструкции заносят в стек указанное слово данных.
Содержимое SPуменьшается на два, после чего по полученному адресу производится запись заданного слова данных.
Флажкине изменяются.
Замечания по программированию
Выполнение инструкции PUSH SPприведёт к записи в стек нового содержимогоSP, т.е. значения, которое находится в этом регистре после вычитания. В процессоре 80286 и последующих в стек заносится исходное содержимое регистраSP, т.е. его значение до вычитания.
Pushf– запись регистра флагов в стек
|
9C |
PUSHF |
запись в стек содержимого регистра FLAGS |
Описание.Эта инструкция заносит в вершину стека содержимое регистраFLAGS.
Перед записью содержимое SPуменьшается на два. Регистр флагов записывается по полученному адресу.
Зарезервированные разряды регистра FLAGSне изменяются.
Флажкине изменяются.
Rcl– циклический сдвиг влево через флажок переноса
|
D0 /2 |
RCL r/m8, 1 |
циклический сдвиг r/m8 влево на 1 разряд через CF |
|
D2 /2 |
RCL r/m8, CL |
циклический сдвиг r/m8 влево на CL разрядов через CF |
|
D1 /2 |
RCL r/m16, 1 |
циклический сдвиг r/m16 влево на 1 разряд через CF |
|
D3 /2 |
RCL r/m16, CL |
циклический сдвиг r/m16 влево на CL разрядов через CF |
Описание.Эта инструкция производит циклический сдвиг содержимого своего операнда влево через флажок переноса на указанное вторым операндом число разрядов.
Сдвиг выполняется по следующей схеме:
┌───────────────────────┐
│ ┌──┐ ┌─────────┐ │
└─┤CF│◄────┤ операнд │◄─┘
└──┘ └─────────┘
Имеются две разновидности сдвига: одноразрядный и многоразрядный. В последнем случае количество разрядов, на которое производится сдвиг, должно быть предварительно занесено в регистр CL.
ФлажокCFсодержит значение последнего выдвинутого из операнда разряда.
Значение флажка OFв операции многоразрядного сдвига не определено. В операции одноразрядного сдвига он представляет собой результат операции “исключающее ИЛИ” между значением старшего разряда результата и содержимым флажкаCFпосле выполнения сдвига. Таким образом, единичное значение флажкаOFсвидетельствует о том, что содержимое старшего разряда результата отличается от его исходного значения, а нулевое значение – что старший разряд операнда не изменился.
Флажки SF,ZF,AFиPFне изменяются.
