- •Оглавление
- •Общие сведения
- •Среда выполнения программ
- •Представление информации
- •Двоичные числа без знака
- •Двоичные числа со знаком
- •Символьная информация
- •Двоично-десятичные числа
- •Адресация памяти
- •Физическая память
- •Сегментация
- •Регистры микропроцессора
- •Регистры общего назначения
- •Сегментные регистры
- •Регистр флагов
- •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. Время выполнения команд
Cmps– сравнение строк
A6 |
CMPSB |
сравнение байтов [DS:SI] и [ES:DI] |
A7 |
CMPSW |
сравнение слов [DS:SI] и [ES:DI] |
Описание.Эта инструкция сравнивает между собой байты или слова источника и приёмника.
Инструкция CMPSотносится к группе инструкций обработки строк. Оба её операнда находятся в памяти. Адрес источника задаётся регистровой паройDS:SI, адрес приёмника – регистровой паройES:DI. Сегментный регистрDSможет быть заменён другим сегментным регистром с помощью префикса замены сегмента; сегментный регистрESзаменён быть не может.
После выполнения операции содержимое регистров SIиDIавтоматически увеличивается или уменьшается на размер операнда, т.е. на 1 или на 2. Увеличение (автоинкремент) имеет место, если флажок направленияDFв регистре флагов сброшен; уменьшение (автодекремент) – если флажокDFустановлен.
Сравнение, как и в команде CMP, выполняется вычитанием значения приёмника из значения источника. Эти значения рассматриваются как двоичные числа со знаком. Результат вычитания теряется, исходные значения операндов не изменяются. По результатам вычитания устанавливаются соответствующие признаки в регистре флагов.
Инструкция CMPSвыполняет сравнение одной пары байтов или слов. При необходимости вместе с ней могут использоваться префиксы повторенияREP/REPcc, что обеспечит сравнение последовательностей байтов или слов памяти.
ФлажкиCF,OF,SF,ZF,AFиPFустанавливаются в соответствии с результатами выполнения операции сравнения.
Замечания по программированию
При записи на языке ассемблера либо используется мнемоника CMPSBилиCMPSW, явно определяющая размер операндов, либо используется обобщённая мнемоникаCMPSс указанием местоположения операндов в памяти. Следует, однако, помнить, что адресация операндов всегда осуществляется с помощью регистровых парDS:SIиES:DI, поэтому указываемые в данной инструкции адреса используются только для определения размера операндов и, возможно, для применения префикса замены сегмента. За правильность установки начальных значений регистров отвечает программист.
Cwd– преобразование слово в двойное слово
99 |
CWD |
Расширение знака AX на DX |
Описание.Содержимое регистраAX, рассматриваемое как число со знаком, расширяется на регистровую паруDX:AX. В регистрDXзаносится старшая часть результата.
Если в AXсодержалось отрицательное число (т.е. если старший разряд регистраAXравен 1), все разряды регистраDXустанавливаются в единицу. Если же вAXсодержался нуль или положительное число (старший разряд регистраAXравен 0), регистрDXобнуляется.
Флажкине изменяются.
Daa– коррекция сложения двоично-десятичных упакованных чисел
27 |
DAA |
двоично-десятичная коррекция сложения AL |
Описание.Эта команда выполняет коррекцию результата сложения двух двоично-кодированных десятичных чисел инструкциейADDилиADC.
Если при выполнении предшествовавшей операции сложения в младшем полубайте регистра ALполучено значение, превышающее 9, или произошёл перенос из 3-го разряда в 4-ый (был установлен флажокAF), то значение младшего полубайта регистраALувеличивается на 6, флажокAFостаётся равным 1, а флажокCFустанавливается, если при прибавлении 6 возник перенос из 3-го разряда (если переноса не было, значение флажкаCFне изменяется, т.е. остаётся таким же, каким оно было до выполнения инструкцииDAA). Если же содержимое младшего полубайта регистраALне превышает 9, а флажокAFсброшен, никаких действий с младшим полубайтом не выполняется.
Затем проверяется содержимое старшего полубайта регистра AL. Если его значение больше 9 либо если установлен флажокCF(независимо от того, был ли он установлен при выполнении команды сложения или при увеличении младшего полубайта на 6 в процессе выполнения инструкцииDAA), то это значение увеличивается на 6 и устанавливается флажокCF. Если же значение старшего полубайта не превышает 9, а флажокCFсброшен, никаких действий со старшим полубайтом не выполняется.
ФлажкиAFиCFустанавливаются в соответствии с результатом операции (см. выше).
Флажки SF,ZFиPFустанавливаются по обычным правилам в соответствии с полученным результатом.
Значение флажка OFне определено.