Мы поможем в написании ваших работ!
ЗНАЕТЕ ЛИ ВЫ?
|
Инструкции работы со стеком.
Команда
| Описание
| 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.
|
Цепочечные операции.
Команда
| Описание
|
REP
REPE и REPZ
REPNE и REPNZ
| REPeat string operation – повторить цепочечную операциюю
Префикс, означающий повтор следующей за ним операции до обнуления ECX. Префикс имеет разновидности:
REPZ (REPE) - выполнять, пока не нуль (ZF=1),
REPNZ (REPNE) – выпо лнять, пока нуль.
| MOVS приемник, источник
MOVSB
MOVSW
MOVSD
| MOVe String Byte/Word/Double word operands – пересылка цепочек. Приемник, источник можно явно не указывать. Команда передает из цепочки, адресуемой DS:[ESI], в цепочку приемника, адресуемую ES:[EDI]. Разновидности для разных элементов цепочки:
· байт,
· слово или
· двойное слово.
| LODS источник
MOVSB
MOVSW
MOVSD
| LOaD String Byte/Word/Double word operands – загрузка цепочек. Загружает из ячейки памяти, адресуемой DS:ESI/si, в регистр AL/AX/EAX цепочку, и изменяет содержимое SI на величину, равную длине цепочки. Разновидности для разных элементов цепочки:
· байт,
· слово или
· двойное слово.
| STOS приемник
STOSB
STOSW
STOSD
| STOre String Byte/Word/Double word operands – сохранение цепочек. Сохраняет в ячейке памяти, адресуемой DS:ESI/SI, из регистра AL/AX/EAX цепочку, и изменяет содержимое SI на величину, равную длине цепочки. Разновидности для разных элементов цепочки:
· байт,
· слово или
· двойное слово.
| SCAS приемник
SCASB
SCASW
SCASD
| SCAn String Byte/Word/Double word – сканированение цепочек. Команда вычитает элемент цепочки приемника из содержимого аккумулятора (AL\AX\EAX) и модифицирует флаги. Разновидности для разных элементов цепочки:
· байт,
· слово или
· двойное слово.
| CMPS приемник, источник
CMPSB
CMPSW
CMPSD
| CoMPare String Byte/Word/Double word operands - сравнение цепочек. Команда вычитанет элемент цепочки приемника из соответствующего элемента цепочки источника и модифицирует флаги. Регистры EDI и ESI автоматически продвигаются на следующий элемент. Разновидности для разных элементов цепочки:
· байт,
· слово или
· двойное слово.
|
Управление флагами.
|