- •Команды общего назначения
- •1.1.1.Команды ввода-вывода
- •1.1.2.Инструкции работы со стеком
- •1.1.3.Арифметико-логические инструкции
- •1.1.4.Цепочечные операции
- •1.1.5.Команды управления
- •1.1.6.Команды поддержки языков высокого уровня
- •1.1.7.Команды прерываний
- •1.1.8.Команды синхронизации процессора
- •1.1.9.Команды обработки цепочки бит
- •Синтаксис ммх-команд
- •1.1.10.Классификация команд
1.1.2.Инструкции работы со стеком
Команда |
Описание |
PUSH источник |
PUSH operand onto stack – поместить в стек. Поместить в стек слово или двойное слово. Поскольку при включении в стек слова нарушается выравнивание стека по границам двойных слов, рекомендуется в любом случае помещать в стек двойное слово. |
PUSH const |
Поместить в стек непосредственный 32-битный операнд. |
PUSHA |
PUSH All general registers onto stack – поместить в стек все регистры общего назначения. Поместить в стек регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. |
POP пприемник |
POP operand from the stack – извлечь операнд из стека. Извлечь из стека слово или двойное слово. |
POPА |
POP All general registers onto stack – извлечь изстека все регистры общего назначения. Извлечье из стека данные в регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. |
PUSHF |
PUSH Flags register onto stack Помещение в стек регистра флагов. |
POPF |
POP Flags register from the stack Извлечь из стека данные в регистр флагов. |
1.1.3.Арифметико-логические инструкции
Целочисленная арифметика
Команда |
Описание |
ADD приемник, источник |
ADDition – сложение. Сложение двух операндов. Один из операндов – приемник. Первый операнд может быть регистром или ячейкой памяти, второй - регистром, ячейкой памяти, константой. Невозможно только, когда оба операнда являются ячейками памяти. |
XADD приемник, источник |
eXchange and ADD –обмен двух значений и суммирование. Данная операция производит в начале обмен операндами, а затем выполняет операцию ADD. |
ADC приемник, источник |
ADdition with Carry. Сложение с учетом флага переноса - в младший бит добавляется бит (флаг) переноса. |
INC операнд |
INCrement operand by 1. Увеличить операнд на 1. |
SUB операнд1, операнд2 |
SUBtract. Вычитание двух операндов. Остальное аналогично сложению (команда ADD). |
SBB операнд1, операнд2 |
SuBtract with Borrow. Вычитание с учетом предыдущего вычитания (бита заема). Из младшего бита вычитается бит (флаг) переноса. |
DEC r/m |
DECrement operand by 1. Уменьшить операнд на 1. |
CMP операнд1, операнд2 |
CoMPare operands – сравнение операндов. Вычитание без изменения операндов (сравнение). |
CMPXCHG приемник, источник |
CoMPare and eXCHanGe – сравнение и обмен.. Сравнение с обменом. Источник – всегда аккумулятор. Если значения в операнде-получателе и аккумуляторе равны, операнд-получатель заменяется операндом-источником, исходное значение операнда-получателя загружается в аккумулятор. |
CMPXCHG8B приемник, источник |
CoMPare and eXCHanGe 8 Byte – сравнение и обмен.. Сравнение с обменом 8 байтов. Источник – всегда аккумулятор. Если значения в операнде-получателе и аккумуляторе равны, операнд-получатель заменяется операндом-источником, исходное значение операнда-получателя загружается в аккумулятор. |
NEG источник |
NEGate operand. Изменение знака операнда. |
ААА |
Ascii Adjust after Addition - ASCII-коррекция после сложения. Алгоритм: проверить значение младшего полубайта регистра AL и значение флага AF; если (значение младшего полубайта регистра AL>9) или (AF=1), то выполнить следующие действия: увеличить значение al на 6, очистить старший полубайт регистра al, увеличить значение ah на 1, установить флаги: AF=1, CF=1; иначе сбросить флаги AF= 0 и CF= 0. |
AAS |
Ascii Adjust after Substraction - ASCII-коррекция после вычитания. Алгоритм работы: если (младший полубайт регистра AL меньше 9) или (флаг AF=1), то выполнить следующие действия: уменьшить значение младшего полубайта регистра al на 6, обнулить значение старшего полубайта регистра AL; установить флаги AF=1 и CF=1;. |
ААМ |
Ascii Adjust after Multiply - ASCII-коррекция после умножения. Алгоритм работы: разделить значение регистра AL на 10; записать частное в регистр AH, остаток — в регистр AL. |
AAD |
Ascii Adjust before Division - ASCII-коррекция перед делением. Алгоритм работы: умножить значение регистра AH на 10 и сложить полученное значение с содержимым регистра AL; присвоить регистру AL это значениеl; обнулить регистр AH. |
DAA |
Decimal Adjust for Addition - десятичная коррекция после сложения. Алгоритм работы. команда работает только с регистром AL и анализирует наличие следующих ситуаций: Ситуация 1. В результате предыдущей команды сложения флаг AF=1 или значение младшей тетрады регистра AL>9. Напомним, что флаг AF устанавливается в 1 в случае переноса двоичной единицы из бита 3 младшей тетрады в старшую тетраду регистра AL (если значение превысило 0fh). Наличие одного из этих двух признаков говорит о том, что значение младшей тетрады превысило 9h. Ситуация 2. В результате предыдущей команды сложения флаг CF=1 или значение регистра AL>9fh. Напомним, что флаг CF устанавливается в 1 в случае переноса двоичной единицы в старший бит операнда (если значение превысило 0ffh в случае регистра AL). Наличие одного из этих двух признаков говорит о том, что значение в регистре AL превысило 9fh. Если имеет место одна из этих двух ситуаций, то регистр al корректируется следующим образом: для ситуации 1 содержимое регистра AL увеличивается на 6; для ситуации 2 содержимое регистра AL увеличивается на 60h; если имеют место обе ситуации, то корректировка начинается с младшей тетрады. |
DAS |
Decimal Adjust for Subtraction - десятичная коррекция после вычитания. Команда работает только с регистром AL и анализирует наличие следующих ситуаций: Ситуация 1. В результате предыдущей команды сложения флаг af =1 или значение младшей тетрады регистра al>9. Напомним, что для случая вычитания флаг af устанавливается в 1 в случае заема двоичной единицы из старшей тетрады в младшую тетраду регистра al. Наличие одного из этих двух признаков говорит о том, что значение младшей тетрады превысило 9h и его нужно корректировать. Ситуация 2. В результате предыдущей команды сложения флаг сf =1 или значение регистра al>9fh. Напомним, что для случая вычитания флаг cf устанавливается в 1 в случае заема двоичной единицы. Наличие одного из этих двух признаков говорит о том, что значение в регистре al превысило 9fh. Если имеет место одна из этих ситуаций, то регистр al корректируется следующим образом: для ситуации 1 содержимое регистра al уменьшается на 6; для ситуации 2 содержимое регистра al уменьшается на 60h; если имеют место обе ситуации, то корректировка начинается с младшей тетрады. |
MUL множитель |
MULtiplay - умножение целых чисел без знака. Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя, который может быть расположен в памяти или в регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя: если операнд, указанный в команде — байт, то второй сомножитель должен располагаться в al; если операнд, указанный в команде — слово, то второй сомножитель должен располагаться в ax; если операнд, указанный в команде — двойное слово, то второй сомножитель должен располагаться в eax. Результат умножения помещается также в фиксированное место, определяемое размером сомножителей: при умножении байтов результат помещается в ax; при умножении слов результат помещается в пару dx:ax; при умножении двойных слов результат помещается в пару edx:eax. |
IMUL множ IMUL множ1, множ2 IMUL резул, множ1, множ2 |
Integer MULtiplay - умножение целых чисел со знаком. Алгоритм работы команды зависит от используемой формы команды. Форма команды с одним операндом требует явного указания местоположения только одного сомножителя, который может быть расположен в ячейке памяти или регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя: если операнд, указанный в команде, — байт, то второй сомножитель располагается в al; если операнд, указанный в команде, — слово, то второй сомножитель располагается в ax; если операнд, указанный в команде, — двойное слово, то второй сомножитель располагается в eax. Результат умножения для команды с одним операндом также помещается в строго определенное место, определяемое размером сомножителей: при умножении байтов результат помещается в ax; при умножении слов результат помещается в пару dx:ax; при умножении двойных слов результат помещается в пару edx:eax. Команды с двумя и тремя операндами однозначно определяют расположение результата и сомножителей следующим образом: в команде с двумя операндами первый операнд определяет местоположение первого сомножителя. На его место впоследствии будет записан результат. Второй операнд определяет местоположение второго сомножителя; в команде с тремя операндами первый операнд определяет местоположение результата, второй операнд — местоположение первого сомножителя, третий операнд может быть непосредственно заданным значением размером в байт, слово или двойное слово. |
DIV делитель |
DIVide unsigned - деление целых чисел без знака. Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно и размер его зависит от размера делителя, который указывается в команде. Алгоритм работы: если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah; если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx; если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx. |
IDIV делитель |
Integer DIVide - деление целых чисел со знаком. Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, местонахождение которого указывается в команде. Алгоритм работы: если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah; если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx; если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx; |
CBW |
Convert Byte to Word - преобразование байта в слово Команда использует только регистры al и ax: Алгоритм работы - анализ знакового бита регистра al: если знаковый бит al=0, то ah=00h; если знаковый бит al=1, то ah=0ffh. |
CWD |
Convert Word to Double word - преобразование слова в двойное слово. Команда использует только регистры al и ax. Алгоритм работы -анализ знакового бита регистра al: если знаковый бит al=0, то ah=00h; если знаковый бит al=1, то ah=0ffh. |
CWDE |
Convert Word to Double word Extended - преобразование слова в двойное слово с расширением. Ккоманда использует только регистры ax и eax. Алгоритм работы - анализ знакового бита регистра ax: если знаковый бит ax=0, то установить старшее слово eax=0000h; если знаковый бит ax=1, то установить старшее слово eax=0ffffh. |
CDQ |
Convert Double word to Quad word Преобразование двойного слова (EAX) в учетверенное слово (EDX:EAX). Алгоритм работы: копирование значения старшего бита регистра eax на все биты регистра edx. |
Логические операции
Команда |
Описание |
AND приемник, источник |
logical AND – логическое И. Побитовая логическая "И". В приемнике бит устанавливается в 1, если отличны от нуля одноименные биты и в источнике, и в приемнике.. |
TEST приемник, источник |
TEST операнд. Аналогична "AND", но не меняет биты приемника. Используется для проверки ненулевых бит. |
OR приемник, источник |
logical OR – логическое включающее ИЛИ. Побитовая логическая "ИЛИ". В приемнике бит устанавливается в 1, если отличны от нуля одноименные биты или в источнике, или в приемнике.. |
XOR приемник, источник |
logical eXclusive OR – логическое исключающее ИЛИ. Побитовая логическая "иселючающее ИЛИ". В приемнике бит устанавливается в 1, если одноименные биты в источнике и приемнике различны.. |
NOT источник |
NOT operand – логическое НЕ. Переключение всех бит (инверсия).. |
Сдвиговые операции
Команда |
Описание |
RCL/RCR dest,src |
Циклический сдвиг влево/вправо через бит переноса CF. Src может быть либо CL, либо непосредственный операнд. |
ROL/ROR dest,src |
Аналогично командам RCL/RCR, но по другому, работает с флагом CF. Флаг не участвует в цикле, но в него попадает бит, перешедший с начала на конец или наоборот. |
SAL/SAR dest,src |
Сдвиг влево/право. Называется еще арифметическим сдвигом. При сдвиге вправо дублируется старший бит. При сдвиге влево младший бит заполняется нулем. Ушедший бит помещается в CF. |
SHL/SHR dest,src |
Логический сдвиг влево/вправо. Сдвиг вправо отличается от SAR тем, что и старший бит заполняется нулем. |
SHLD/SHRD dest,src,count |
Трехоперандные команды сдвига влево/вправо. Первым операндом, как обычно, может быть либо регистр, либо ячейка памяти, вторым операндом должен быть регистр общего назначения, третьим - регистр CL или непосредственный операнд. Суть операции заключается в том, что dest и src в начале объединяются, а потом производится сдвиг на количество бит count. Результат снова помещается в dest. |