reverseenengineering:основы

Это старая версия документа!


Основы

КомандаВыполняемая операцияГруппа
AAAASCII-коррекция после сложенияДесятичная арифметика
AADASCII-коррекция регистра AX перед делениемДесятичная арифметика
AAMASCII-коррекция регистра AX после умноженияДесятичная арифметика
AASASCII-коррекция после вычитанияДесятичная арифметика
ADCСложение с переносомОсновная арифметика
ADDСложениеОсновная арифметика
ANDЛогическое «И»Основная арифметика
ARPLКоррекция поля RPL селектораПривилегированные
BOUNDКонтроль нахождения индекса массива в границахСпециальные команды
BSFСканирование бита впередРабота с битами
BSRСканирование бита назадРабота с битами
BSWAPПерестановка байтов (внутри 32-бит. регистра)Пересылка данных
BTПроверка битаРабота с битами
BTCПроверка бита и дополнениеРабота с битами
BTRПроверка бита и сброс в 0Работа с битами
BTSПроверка бита и установка в 1Работа с битами
CALLВызов процедурыПереходы и процедуры
CBWПреобразование байта в словоПересылка данных
CDQПреобразование двойного слова в счетверенное словоПересылка данных
CLCСброс флажка переносаУстановка флажков
CLDСброс флажка направленияУстановка флажков
CLIСброс флажка прерыванияУстановка флажков
CLTSСброс флажка переключения задачиПривилегированные
CMCИнвертирование флажка переносаУстановка флажков
CMPСравнение двух операндовОсновная арифметика
CMPSСравнение цепочечных операндовЦепочечные команды
CMPXCHGСравнение и обменСпециальные команды
CWDПреобразование слова в двойное словоПересылка данных
CWDEПреобразование слова в двойное словоПересылка данных
DAAДесятичная коррекция AL после сложенияДесятичная арифметика
DASДесятичная коррекция AL после вычитанияДесятичная арифметика
DECДекремент на 1Инкремент и декремент
DIБеззнаковое делениеУмножение и деление
ENTERОбразование стекового кадра для параметров процедурыПереходы и процедуры
ESУниверсальная единая команда для сопроцессора с плавающей точкойСопроцессор
F..Команды сопроцессора с плавающей точкойСопроцессор
HLTОстановПривилегированные
IDIVЗнаковое делениеУмножение и деление
IMULЗнаковое умножениеУмножение и деление
INВвод из портаСистемные команды
INCИнкремент на 1Инкремент и декремент
INSВвод из порта в цепочкуЦепочечные команды
INTВызов процедуры прерывания Вызов прерывания
INTOВызов процедуры прерывания 4, если OF=1 Вызов прерывания
INVDНедостоверность кэш-памяти Системные команды
INVLPGНедостоверность элемента буфера TLB Системные команды
IRETВозврат из прерывания Вызов прерывания
J(cond)Условная передача управления Условные команды
JCXZ-JECXZПереход, если значение счетчика равно нулюУсловные команды
JMPБезусловная передача управления Переходы и процедуры
LAHFПересылка из регистра флажков в регистр AHУстановка флажков
LARЗагрузка байта прав доступаПривилегированные
LDSЗагрузка полного указателя (для DS)Сегментные регистры
LEAЗагрузка эффективного адреса Специальные команды
LEAVEОтмена действия команды ENTER перед выходом из процедурыПереходы и процедуры
LESЗагрузка полного указателя (для ES) Сегментные регистры
LFSЗагрузка полного указателя (для FS) Сегментные регистры
LGDTЗагрузка регистра глобальной дескрипторной таблицы Привилегированные
LGSЗагрузка полного указателя (для GS) Сегментные регистры
LIDTЗагрузка регистра дескрипторной таблицы прерываний Привилегированные
LLDTЗагрузка регистра локальной дескрипторной таблицы Привилегированные
LMSWЗагрузка слова состояния машины Привилегированные
LOCKПрефикс выдачи сигнала LOCK# Системные команды
LODSЗагрузка цепочечного операнда в аккумулятор Цепочечные команды
LOOPУправление циклом со счетчиком в регистре CX Условные команды
LOOPE-LOOPZУправление циклом со счетчиком в регистре CX Условные команды
LOOPNE-LOOPNZУправление циклом со счетчиком в регистре CX Условные команды
LSLЗагрузка предела сегмента Системные команды
LSSЗагрузка полного указателя (для SS) Сегментные регистры
LTRЗагрузка регистра задачи Привилегированные
MOVПересылка данных Пересылка данных
MOV(spec)Пересылка в специальные регистры и из них Привилегированные
MOVSПересылка данных из цепочки в цепочку Цепочечные команды
MOVSXПересылка со знаковым расширением Пересылка данных
MOVZXПересылка с нулевым расширением Пересылка данных
MULБеззнаковое умножениеУмножение и деление
NEGПолучение дополнительного кода (изменение знака)Основная арифметика
NOPПустая операция Пересылка данных
NOTИнвертирование Основная арифметика
ORЛогическое включающее «ИЛИ» Основная арифметика
OUTВывод в порт Системные команды
OUTSВывод цепочки в порт Цепочечные команды
POPИзвлечение слова из стека Работа со стеком
POPAИзвлечение из стека всех общих регистров Работа со стеком
POPFИзвлечение из стека в регистр флажков Работа со стеком
PUSHЗасылка операнда в стек Работа со стеком
PUSHAЗасылка в стек всех общих регистров Работа со стеком
PUSHFЗасылка в стек регистра флажков Работа со стеком
RCLЦиклический сдвиг влево с участием флажка CF Команды сдвига
RCRЦиклический сдвиг вправо с участием флажка CF Команды сдвига
REPПрефикс повторения цепочечной операции Цепочечные команды
REPE-REPZПрефикс повторения цепочечной операции Цепочечные команды
REPNE-REPNZПрефикс повторения цепочечной операции Цепочечные команды
RETВозврат из процедуры Переходы и процедуры
ROLЦиклический сдвиг влево Команды сдвига
RORЦиклический сдвиг вправо Команды сдвига
SAHFПересылка регистра AH в регистр флажков Установка флажков
SALСдвиг влево (умножение на 2) Команды сдвига
SALCУстановка регистра AL по флажку CF Установка флажков
SARСдвиг вправо (знаковое деление на 2) Команды сдвига
SBBВычитание с заемом Основная арифметика
SCASСравнение (сканирование) цепочечных данных Цепочечные команды
SET(cond)Установка байта по условию Условные команды
SGDTСохранение регистра глобальной дескрипторной таблицы Привилегированные
SHLСдвиг влево (умножение на 2) Команды сдвига
SHLDДвойной сдвиг влево Команды сдвига
SHRСдвиг вправо (беззнаковое деление на 2) Команды сдвига
SHRDДвойной сдвиг вправо Команды сдвига
SIDTСохранение регистра дескрипторной таблицы прерываний Привилегированные
SLDTСохранение регистра локальной дескрипторной таблицы Привилегированные
SMSWСохранение слова состояния машины Привилегированные
STCУстановка флажка переноса Установка флажков
STDУстановка флажка направления Установка флажков
STIУстановка флажка прерывания Установка флажков
STOSСохранение цепочечных данных Цепочечные команды
STRСохранение регистра задачи Привилегированные
SUBВычитание Основная арифметика
TESTЛогическое сравнение Основная арифметика
VERRПроверка сегмента на считывание Системные команды
VERWПроверка сегмента на запись Системные команды
WAITОжидание Системные команды
WBINVDОбратная запись и недостоверность кэш-памяти Системные команды
XADDОбмен и сложение Специальные команды
XCHGОбмен данными - регистр/регистр или регистр/память Пересылка данных
XLATПерекодирование байта по таблице Специальные команды
XORЛогическое исключающее «ИЛИ» Основная арифметика
Команды ADD, OR, ADC, SBB, AND, SUB, XOR, CMP - эти восемь команд можно назвать самыми первыми в системе команд x86 («первая восьмерка»), достаточно взглянуть на ту таблицу команд, в которой команды расположены в порядке кодов операций. Все эти команды имеют два операнда и совершенно одинаковый формат (три разных формы), как на языке ассемблера, так и в машинных кодах.
Команда TEST также имеет два операнда. Три ее формы почти такие же, как у команд первой восьмерки и отличаются только в деталях.
Команды NEG и NOT имеют только один операнд, их формат намного проще.
Примечание. Команды умножения и деления помещены в свою отдельную группу: Умножение и деление

Порядок операндов

На языке ассемблера для команды с двумя операндами принято записывать операнды в следующем порядке:
CMD   dst, src

Здесь CMD - мнемоника команды, dst (destination) - приемник, src (source) - источник. Результат выполнения операции заносится в первый операнд dst.

В операциях вычитания из значения dst вычитается значение src.

Таким образом, операции сложения ADD и вычитания SUB будут выглядить так:

dst = dst + src
dst = dst - src

Команды с участием флага переноса

Команда ADC выполняет сложение трех слагаемых: первого (dst) операнда, второго (src) операнда и флага переноса CF (значение 0 или 1). Результат выполнения операции заносится в первый (dst) операнд.

По команде SBB из значения первого (dst) операнда вычитается значение второго (src) операнда. Из полученного результата вычитается значение флага переноса CF (значение 0 или 1). Результат выполнения операции заносится в первый (dst) операнд.

Условно это можно показать так:

 dst = dst + src + CF
 dst = dst - src - CF
Команды AND, OR, XOR выполняют поразрядные логические операции для двух своих операндов. Для каждой битовой позиции результат определяется так:
Команда NEG выполняет арифметическую операцию вычитания операнда из нуля. Фактически это равносильно изменению знака операнда.
Команда NOT выполняет порязрядную логическую операцию инвертирования, каждый 0 заменяется на 1 и каждая 1 заменяется на 0.
  • reverseenengineering/основы.1751626520.txt.gz
  • Последнее изменение: 2025/07/04 17:55
  • Lex