Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
| reverseenengineering:основы [2025/07/04 17:48] – [Некоторые основные команды ассемблера] Lex | reverseenengineering:основы [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 вычитается значение src. | ||
| + | |||
| + | > Таким образом, | ||
| + | |||
| + | dst = dst + src | ||
| + | dst = dst - src | ||
| + | |||
| + | === Команды с участием флага переноса === | ||
| + | |||
| + | > Команда ADC выполняет сложение трех слагаемых: | ||
| + | |||
| + | > По команде SBB из значения первого (dst) операнда вычитается значение второго (src) операнда. Из полученного результата вычитается значение флага переноса CF (значение 0 или 1). Результат выполнения операции заносится в первый (dst) операнд. | ||
| + | |||
| + | > Условно это можно показать так: | ||
| + | |||
| + | dst = dst + src + CF | ||
| + | dst = dst - src - CF | ||
| + | |||
| + | ==== Логические операции ==== | ||
| + | |||
| + | > Команды AND, OR, XOR выполняют поразрядные логические операции для двух своих операндов. Для каждой битовой позиции результат определяется так: | ||
| + | |||
| + | ==== Команды с одним операндом ==== | ||
| + | |||
| + | > Команда NEG выполняет арифметическую операцию вычитания операнда из нуля. Фактически это равносильно изменению знака операнда. | ||
| + | |||
| + | > Команда NOT выполняет порязрядную логическую операцию инвертирования, | ||
| + | |||
| + | ==== Сравнение двух операндов ==== | ||
| + | > | ||
| + | ==== Установка флажков ==== | ||
| + | > | ||
| + | ==== ==== | ||
| + | > | ||