Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
| reverseenengineering:основы [2025/07/04 17:43] – [Некоторые основные команды ассемблера] Lex | reverseenengineering:основы [2025/07/04 17:56] (текущий) – [Операнды, коды, форматы] Lex | ||
|---|---|---|---|
| Строка 36: | Строка 36: | ||
| |DEC|Декремент на 1|Инкремент и декремент| | |DEC|Декремент на 1|Инкремент и декремент| | ||
| |DI|Беззнаковое деление|Умножение и деление| | |DI|Беззнаковое деление|Умножение и деление| | ||
| - | |ENTER|Образование стекового кадра для параметров процедуры| Переходы и процедуры| | + | |ENTER|Образование стекового кадра для параметров процедуры|Переходы и процедуры| |
| - | |ES|Универсальная единая команда для сопроцессора с плавающей точкой| Сопроцессор| | + | |ES|Универсальная единая команда для сопроцессора с плавающей точкой|Сопроцессор| |
| - | |F..|Команды сопроцессора с плавающей точкой| Сопроцессор| | + | |F..|Команды сопроцессора с плавающей точкой|Сопроцессор| |
| - | |HLT|Останов| Привилегированные| | + | |HLT|Останов|Привилегированные| |
| - | |IDIV|Знаковое деление| Умножение и деление| | + | |IDIV|Знаковое деление|Умножение и деление| |
| - | |IMUL| Знаковое умножение| Умножение и деление| | + | |IMUL|Знаковое умножение|Умножение и деление| |
| - | |IN| Ввод из порта |Системные команды| | + | |IN|Ввод из порта|Системные команды| |
| - | |INC| Инкремент на 1 |Инкремент и декремент| | + | |INC|Инкремент на 1|Инкремент и декремент| |
| - | |INS| Ввод из порта в цепочку |Цепочечные команды| | + | |INS|Ввод из порта в цепочку|Цепочечные команды| |
| - | |INT| Вызов процедуры прерывания |Вызов прерывания| | + | |INT|Вызов процедуры прерывания |Вызов прерывания| |
| - | |INTO| Вызов процедуры прерывания 4, если OF=1 |Вызов прерывания| | + | |INTO|Вызов процедуры прерывания 4, если OF=1 |Вызов прерывания| |
| - | |INVD| Недостоверность кэш-памяти |Системные команды| | + | |INVD|Недостоверность кэш-памяти |Системные команды| |
| - | |INVLPG| Недостоверность элемента буфера TLB |Системные команды| | + | |INVLPG|Недостоверность элемента буфера TLB |Системные команды| |
| - | |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) |Сегментные регистры| |
| - | |LGDT| Загрузка регистра глобальной дескрипторной таблицы |Привилегированные| | + | |LGDT|Загрузка регистра глобальной дескрипторной таблицы |Привилегированные| |
| - | |LGS| Загрузка полного указателя (для GS) |Сегментные регистры| | + | |LGS|Загрузка полного указателя (для GS) |Сегментные регистры| |
| - | |LIDT| Загрузка регистра дескрипторной таблицы прерываний |Привилегированные| | + | |LIDT|Загрузка регистра дескрипторной таблицы прерываний |Привилегированные| |
| - | |LLDT| Загрузка регистра локальной дескрипторной таблицы |Привилегированные| | + | |LLDT|Загрузка регистра локальной дескрипторной таблицы |Привилегированные| |
| - | |LMSW| Загрузка слова состояния машины |Привилегированные| | + | |LMSW|Загрузка слова состояния машины |Привилегированные| |
| - | |LOCK| Префикс выдачи сигнала LOCK# | + | |LOCK|Префикс выдачи сигнала LOCK# |
| - | |LODS| Загрузка цепочечного операнда в аккумулятор |Цепочечные команды| | + | |LODS|Загрузка цепочечного операнда в аккумулятор |Цепочечные команды| |
| - | |LOOP| Управление циклом со счетчиком в регистре CX |Условные команды| | + | |LOOP|Управление циклом со счетчиком в регистре CX |Условные команды| |
| - | |LOOPE-LOOPZ| Управление циклом со счетчиком в регистре CX |Условные команды| | + | |LOOPE-LOOPZ|Управление циклом со счетчиком в регистре CX |Условные команды| |
| - | |LOOPNE-LOOPNZ| Управление циклом со счетчиком в регистре CX |Условные команды| | + | |LOOPNE-LOOPNZ|Управление циклом со счетчиком в регистре CX |Условные команды| |
| - | |LSL| Загрузка предела сегмента |Системные команды| | + | |LSL|Загрузка предела сегмента |Системные команды| |
| - | |LSS| Загрузка полного указателя (для SS) |Сегментные регистры| | + | |LSS|Загрузка полного указателя (для SS) |Сегментные регистры| |
| - | |LTR| Загрузка регистра задачи |Привилегированные| | + | |LTR|Загрузка регистра задачи |Привилегированные| |
| - | |MOV| Пересылка данных |Пересылка данных| | + | |MOV|Пересылка данных |Пересылка данных| |
| - | |MOV(spec) Пересылка в специальные регистры и из них |Привилегированные| | + | |MOV(spec)|Пересылка в специальные регистры и из них |Привилегированные| |
| - | |MOVS| Пересылка данных из цепочки в цепочку |Цепочечные команды| | + | |MOVS|Пересылка данных из цепочки в цепочку |Цепочечные команды| |
| - | |MOVSX| Пересылка со знаковым расширением |Пересылка данных| | + | |MOVSX|Пересылка со знаковым расширением |Пересылка данных| |
| - | |MOVZX| Пересылка с нулевым расширением |Пересылка данных| | + | |MOVZX|Пересылка с нулевым расширением |Пересылка данных| |
| - | |MUL| Беззнаковое умножение| Умножение и деление| | + | |MUL|Беззнаковое умножение|Умножение и деление| |
| - | |NEG| Получение дополнительного кода (изменение знака)| Основная арифметика| | + | |NEG|Получение дополнительного кода (изменение знака)|Основная арифметика| |
| - | |NOP| Пустая операция |Пересылка данных| | + | |NOP|Пустая операция |Пересылка данных| |
| - | |NOT| Инвертирование |Основная арифметика| | + | |NOT|Инвертирование |Основная арифметика| |
| - | |OR| Логическое включающее " | + | |OR|Логическое включающее " |
| - | |OUT| Вывод в порт |Системные команды| | + | |OUT|Вывод в порт |Системные команды| |
| - | |OUTS| Вывод цепочки в порт |Цепочечные команды| | + | |OUTS|Вывод цепочки в порт |Цепочечные команды| |
| - | |POP| Извлечение слова из стека |Работа со стеком| | + | |POP|Извлечение слова из стека |Работа со стеком| |
| - | |POPA| Извлечение из стека всех общих регистров |Работа со стеком| | + | |POPA|Извлечение из стека всех общих регистров |Работа со стеком| |
| - | |POPF| Извлечение из стека в регистр флажков |Работа со стеком| | + | |POPF|Извлечение из стека в регистр флажков |Работа со стеком| |
| - | |PUSH| Засылка операнда в стек |Работа со стеком| | + | |PUSH|Засылка операнда в стек |Работа со стеком| |
| - | |PUSHA| Засылка в стек всех общих регистров |Работа со стеком| | + | |PUSHA|Засылка в стек всех общих регистров |Работа со стеком| |
| - | |PUSHF| Засылка в стек регистра флажков |Работа со стеком| | + | |PUSHF|Засылка в стек регистра флажков |Работа со стеком| |
| - | |RCL| Циклический сдвиг влево с участием флажка CF |Команды сдвига| | + | |RCL|Циклический сдвиг влево с участием флажка CF |Команды сдвига| |
| - | |RCR| Циклический сдвиг вправо с участием флажка CF |Команды сдвига| | + | |RCR|Циклический сдвиг вправо с участием флажка CF |Команды сдвига| |
| - | |REP| Префикс повторения цепочечной операции |Цепочечные команды| | + | |REP|Префикс повторения цепочечной операции |Цепочечные команды| |
| - | |REPE-REPZ| Префикс повторения цепочечной операции |Цепочечные команды| | + | |REPE-REPZ|Префикс повторения цепочечной операции |Цепочечные команды| |
| - | |REPNE-REPNZ| Префикс повторения цепочечной операции |Цепочечные команды| | + | |REPNE-REPNZ|Префикс повторения цепочечной операции |Цепочечные команды| |
| - | |RET| Возврат из процедуры |Переходы и процедуры| | + | |RET|Возврат из процедуры |Переходы и процедуры| |
| - | |ROL| Циклический сдвиг влево |Команды сдвига| | + | |ROL|Циклический сдвиг влево |Команды сдвига| |
| - | |ROR| Циклический сдвиг вправо |Команды сдвига| | + | |ROR|Циклический сдвиг вправо |Команды сдвига| |
| - | |SAHF| Пересылка регистра AH в регистр флажков |Установка флажков| | + | |SAHF|Пересылка регистра AH в регистр флажков |Установка флажков| |
| - | |SAL| Сдвиг влево (умножение на 2) |Команды сдвига| | + | |SAL|Сдвиг влево (умножение на 2) |Команды сдвига| |
| - | |SALC| Установка регистра AL по флажку CF |Установка флажков| | + | |SALC|Установка регистра AL по флажку CF |Установка флажков| |
| - | |SAR| Сдвиг вправо (знаковое деление на 2) |Команды сдвига| | + | |SAR|Сдвиг вправо (знаковое деление на 2) |Команды сдвига| |
| - | |SBB| Вычитание с заемом |Основная арифметика| | + | |SBB|Вычитание с заемом |Основная арифметика| |
| - | |SCAS| Сравнение (сканирование) цепочечных данных |Цепочечные команды| | + | |SCAS|Сравнение (сканирование) цепочечных данных |Цепочечные команды| |
| - | |SET(cond) Установка байта по условию |Условные команды| | + | |SET(cond)|Установка байта по условию |Условные команды| |
| - | |SGDT| Сохранение регистра глобальной дескрипторной таблицы |Привилегированные| | + | |SGDT|Сохранение регистра глобальной дескрипторной таблицы |Привилегированные| |
| - | |SHL| Сдвиг влево (умножение на 2) |Команды сдвига| | + | |SHL|Сдвиг влево (умножение на 2) |Команды сдвига| |
| - | |SHLD| Двойной сдвиг влево |Команды сдвига| | + | |SHLD|Двойной сдвиг влево |Команды сдвига| |
| - | |SHR| Сдвиг вправо (беззнаковое деление на 2) |Команды сдвига| | + | |SHR|Сдвиг вправо (беззнаковое деление на 2) |Команды сдвига| |
| - | |SHRD| Двойной сдвиг вправо |Команды сдвига| | + | |SHRD|Двойной сдвиг вправо |Команды сдвига| |
| - | |SIDT| Сохранение регистра дескрипторной таблицы прерываний |Привилегированные| | + | |SIDT|Сохранение регистра дескрипторной таблицы прерываний |Привилегированные| |
| - | |SLDT| Сохранение регистра локальной дескрипторной таблицы |Привилегированные| | + | |SLDT|Сохранение регистра локальной дескрипторной таблицы |Привилегированные| |
| - | |SMSW| Сохранение слова состояния машины |Привилегированные| | + | |SMSW|Сохранение слова состояния машины |Привилегированные| |
| - | |STC| Установка флажка переноса |Установка флажков| | + | |STC|Установка флажка переноса |Установка флажков| |
| - | |STD| Установка флажка направления |Установка флажков| | + | |STD|Установка флажка направления |Установка флажков| |
| - | |STI| Установка флажка прерывания |Установка флажков| | + | |STI|Установка флажка прерывания |Установка флажков| |
| - | |STOS| Сохранение цепочечных данных |Цепочечные команды| | + | |STOS|Сохранение цепочечных данных |Цепочечные команды| |
| - | |STR| Сохранение регистра задачи |Привилегированные| | + | |STR|Сохранение регистра задачи |Привилегированные| |
| - | |SUB| Вычитание |Основная арифметика| | + | |SUB|Вычитание |Основная арифметика| |
| - | |TEST| Логическое сравнение |Основная арифметика| | + | |TEST|Логическое сравнение |Основная арифметика| |
| - | |VERR| Проверка сегмента на считывание |Системные команды| | + | |VERR|Проверка сегмента на считывание |Системные команды| |
| - | |VERW| Проверка сегмента на запись |Системные команды| | + | |VERW|Проверка сегмента на запись |Системные команды| |
| - | |WAIT| Ожидание |Системные команды| | + | |WAIT|Ожидание |Системные команды| |
| - | |WBINVD| Обратная запись и недостоверность кэш-памяти |Системные команды| | + | |WBINVD|Обратная запись и недостоверность кэш-памяти |Системные команды| |
| - | |XADD| Обмен и сложение |Специальные команды| | + | |XADD|Обмен и сложение |Специальные команды| |
| - | |XCHG| Обмен данными - регистр/ | + | |XCHG|Обмен данными - регистр/ |
| - | |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 выполняет порязрядную логическую операцию инвертирования, | ||
| + | |||
| + | ==== Сравнение двух операндов ==== | ||
| + | > | ||
| + | ==== Установка флажков ==== | ||
| + | > | ||
| + | ==== ==== | ||
| + | > | ||