Арифметико-логические инструкции
Инструкции работы со стеком
Команда | Описание |
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 Извлечь из стека данные в регистр флагов. |
Целочисленная арифметика
Команда | Описание |
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 – логическое НЕ. Переключение всех бит (инверсия).. |
Сдвиговые операции