- •Оглавление
- •Общие сведения
- •Среда выполнения программ
- •Представление информации
- •Двоичные числа без знака
- •Двоичные числа со знаком
- •Символьная информация
- •Двоично-десятичные числа
- •Адресация памяти
- •Физическая память
- •Сегментация
- •Регистры микропроцессора
- •Регистры общего назначения
- •Сегментные регистры
- •Регистр флагов
- •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. Время выполнения команд
Xchg– обмен информацией
90+rw |
XCHG AX, r16 |
AX ↔ r16 |
90+rw |
XCHG r16, AX |
r16 ↔ AX |
86 /r |
XCHG r/m8, r8 |
r/m8 ↔ r8 |
86 /r |
XCHG r8, r/m8 |
r8 ↔ r/m8 |
87 /r |
XCHG r/m16, r16 |
r/m16 ↔ r16 |
87 /r |
XCHG r16, r/m16 |
r16 ↔ r/m16 |
Описание.Эта инструкция меняет местами содержимое своих операндов.
Флажкине изменяются.
Xlatb– табличная перекодировка
D7 |
XLATB |
AL:= [BX+AL] |
Описание.Эта инструкция перекодирует по таблице значение регистраAL.
Начальный адрес 256-байтовой таблицы перекодировки содержится в регистре BX. Перекодировка заключается в том, что из ячейки таблицы, номер которой содержится в регистреAL, извлекается байт и заносится в регистрAL.
Флажкине изменяются.
Xor– исключающее или
30 /r |
XOR r/m8, r8 |
r/m8:= r/m8 XOR r8 |
31 /r |
XOR r/m16, r16 |
r/m16:= r/m16 XOR r16 |
32 /r |
XOR r8, r/m8 |
r8:= r8 XOR r/m8 |
33 /r |
XOR r16, r/m16 |
r16:= r16 XOR r/m16 |
34 ib |
XOR AL, imm8 |
AL:= AL XOR imm8 |
35 iw |
XOR AX, imm16 |
AX:= AX XOR imm16 |
80 /6 ib |
XOR r/m8, imm8 |
r/m8:= r/m8 XOR imm8 |
81 /6 iw |
XOR r/m16, imm16 |
r/m16:= r/m16 XOR imm16 |
Описание.Выполняется операция “исключающее ИЛИ” между операндами инструкции, результат заносится на место первого операнда.
ФлажкиOFиCFочищаются.
Флажки SF,ZFиPFустанавливаются в соответствии с результатом.
Состояние флажка AFне определено.
Префиксы машинных инструкций
Ds:/es:/ss:/cs:– префиксы замены сегмента
26 |
ES: |
использование сегмента ES |
2E |
CS: |
использование сегмента CS |
36 |
SS: |
использование сегмента SS |
3E |
DS: |
использование сегмента DS |
Описание.Префикс замены сегмента позволяет инструкции использовать операнд, расположенный не в сегменте, используемом по умолчанию, а в явно указанном сегменте.
В инструкциях обработки данных с явно заданными операндами (например, MOV,ADD,NEGи т.п.) один из операндов (или единственный операнд) может находиться в памяти. Для доступа к нему по умолчанию используется сегментный регистрSS(если при вычислении адреса операнда используется содержимое регистраBP) или сегментный регистрDS(во всех остальных случаях). С помощью префикса замены сегмента можно обратиться к операнду с использованием любого из четырёх сегментных регистров. Например, инструкцияMOV AX,[BP]загружает в регистрAXсодержимое слова памяти по адресуSS:BP, однако инструкцияMOV AX,ES:[BP]загрузит содержимое слова по адресуES:BP.
В инструкциях обработки строк операнды адресуются с помощью регистровых пар DS:SIиES:DI. Вместо сегментного регистраDSможет использоваться любой сегментный регистр, для чего необходимо задать соответствующий префикс замены сегмента. Сегментный регистрES, используемый совместно с регистромDI, заменён быть не может.
Доступ к стековой памяти с использованием указателя стека SPвсегда подразумевает использование сегментного регистраSS, который подменён быть не может.