- •Оглавление
- •Общие сведения
- •Среда выполнения программ
- •Представление информации
- •Двоичные числа без знака
- •Двоичные числа со знаком
- •Символьная информация
- •Двоично-десятичные числа
- •Адресация памяти
- •Физическая память
- •Сегментация
- •Регистры микропроцессора
- •Регистры общего назначения
- •Сегментные регистры
- •Регистр флагов
- •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не изменяются.