Арифметико-логические инструкции

Инструкции работы со стеком

Команда Описание
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 – логическое НЕ. Переключение всех бит (инверсия)..

Сдвиговые операции

Команда Описание
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.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: