reverseenengineering:основы

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
reverseenengineering:основы [2025/07/04 17:35] – [Некоторые основные команды ассемблера] Lexreverseenengineering:основы [2025/07/04 17:56] (текущий) – [Операнды, коды, форматы] Lex
Строка 4: Строка 4:
 ^Команда^Выполняемая операция^Группа^ ^Команда^Выполняемая операция^Группа^
 |AAA|ASCII-коррекция после сложения|Десятичная арифметика| |AAA|ASCII-коррекция после сложения|Десятичная арифметика|
 +|AAD|ASCII-коррекция регистра AX перед делением|Десятичная арифметика|
 +|AAM|ASCII-коррекция регистра AX после умножения|Десятичная арифметика|
 +|AAS|ASCII-коррекция после вычитания|Десятичная арифметика|
 +|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/основы.1751625300.txt.gz
  • Последнее изменение: 2025/07/04 17:35
  • Lex