reverseenengineering:основы

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
reverseenengineering:основы [2025/07/04 17:48] – [Некоторые основные команды ассемблера] Lexreverseenengineering:основы [2025/07/04 17:56] (текущий) – [Операнды, коды, форматы] Lex
Строка 41: Строка 41:
 |HLT|Останов|Привилегированные| |HLT|Останов|Привилегированные|
 |IDIV|Знаковое деление|Умножение и деление| |IDIV|Знаковое деление|Умножение и деление|
-|IMUL|Знаковое умножение| Умножение и деление| +|IMUL|Знаковое умножение|Умножение и деление| 
-|IN|Ввод из порта |Системные команды| +|IN|Ввод из порта|Системные команды| 
-|INC|Инкремент на 1 |Инкремент и декремент| +|INC|Инкремент на 1|Инкремент и декремент| 
-|INS|Ввод из порта в цепочку |Цепочечные команды|+|INS|Ввод из порта в цепочку|Цепочечные команды|
 |INT|Вызов процедуры прерывания |Вызов прерывания| |INT|Вызов процедуры прерывания |Вызов прерывания|
 |INTO|Вызов процедуры прерывания 4, если OF=1 |Вызов прерывания| |INTO|Вызов процедуры прерывания 4, если OF=1 |Вызов прерывания|
Строка 51: Строка 51:
 |IRET|Возврат из прерывания |Вызов прерывания| |IRET|Возврат из прерывания |Вызов прерывания|
 |J(cond)|Условная передача управления |Условные команды| |J(cond)|Условная передача управления |Условные команды|
-|JCXZ-JECXZ|Переход, если значение счетчика равно нулю| Условные команды|+|JCXZ-JECXZ|Переход, если значение счетчика равно нулю|Условные команды|
 |JMP|Безусловная передача управления |Переходы и процедуры| |JMP|Безусловная передача управления |Переходы и процедуры|
-|LAHF|Пересылка из регистра флажков в регистр AH| Установка флажков| +|LAHF|Пересылка из регистра флажков в регистр AH|Установка флажков| 
-|LAR|Загрузка байта прав доступа| Привилегированные| +|LAR|Загрузка байта прав доступа|Привилегированные| 
-|LDS|Загрузка полного указателя (для DS)| Сегментные регистры|+|LDS|Загрузка полного указателя (для DS)|Сегментные регистры|
 |LEA|Загрузка эффективного адреса |Специальные команды| |LEA|Загрузка эффективного адреса |Специальные команды|
-|LEAVE|Отмена действия команды ENTER перед выходом из процедуры| Переходы и процедуры|+|LEAVE|Отмена действия команды ENTER перед выходом из процедуры|Переходы и процедуры|
 |LES|Загрузка полного указателя (для ES) |Сегментные регистры| |LES|Загрузка полного указателя (для ES) |Сегментные регистры|
 |LFS|Загрузка полного указателя (для FS) |Сегментные регистры| |LFS|Загрузка полного указателя (для FS) |Сегментные регистры|
Строка 78: Строка 78:
 |MOVSX|Пересылка со знаковым расширением |Пересылка данных| |MOVSX|Пересылка со знаковым расширением |Пересылка данных|
 |MOVZX|Пересылка с нулевым расширением |Пересылка данных| |MOVZX|Пересылка с нулевым расширением |Пересылка данных|
-|MUL|Беззнаковое умножение| Умножение и деление| +|MUL|Беззнаковое умножение|Умножение и деление| 
-|NEG|Получение дополнительного кода (изменение знака)| Основная арифметика|+|NEG|Получение дополнительного кода (изменение знака)|Основная арифметика|
 |NOP|Пустая операция |Пересылка данных| |NOP|Пустая операция |Пересылка данных|
 |NOT|Инвертирование |Основная арифметика| |NOT|Инвертирование |Основная арифметика|
Строка 129: Строка 129:
 |XLAT|Перекодирование байта по таблице |Специальные команды| |XLAT|Перекодирование байта по таблице |Специальные команды|
 |XOR|Логическое исключающее "ИЛИ" |Основная арифметика| |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/основы.1751626083.txt.gz
  • Последнее изменение: 2025/07/04 17:48
  • Lex