Как можно проверить вывод команд x86?

У меня возникают трудности с определением соответствующих адресов и значений, которые хранятся в конкретных регистрах при выполнении команд x86.

Я пытаюсь выполнить следующие инструкции с начальными значениями, назначенными этим двум регистрам:

eax = 0x40000, ebx = 0x100000

Ниже приведенная команда указана в левой части каждой строки. Затем в каждой строке ответ, содержащий регистр назначения адреса и, наконец, значение / адрес, который я придумал. Каждый новый ряд влияет на последующие значения регистров; например в первой строке eax меняет адрес ebx так ebx больше не указывает на значение 0x100000:

mov [ebx], eax               -> answer: [0x100000] 0x40000 
lea esp, [ebx+eax*4]         -> answer: esp [0x440000] 
xor edx, edx                 -> answer: edx 0x00000
sub edx, eax                 -> answer: edx 0x40000
adc ebx, eax                 -> answer: ebx 0x80000
shl eax, 13                  -> answer: eax 0x100000000
add ebx, eax                 -> answer: ebx 0x100040000
push ebx                     -> answer: esp 0x100040000 
sar eax, 31                  -> answer: eax 0x00000002
push eax                     -> answer: esp 0x00000002
mov eax, [esp+4]             -> answer: eax 0x00000202
not eax                      -> answer: ecx 0x2
sub eax, [esp]               -> answer: eax 0x200

У меня есть особая проблема со следующими командами: lea, not а также sar и я не уверен, xor Команда устанавливает регистр в '0' в xor edx, edx команда или нет.

Буду очень признателен, если вы исправите мои результаты и объясните хитрые части / команды.

PS Чтобы увидеть полный список операций в таблице, пожалуйста, смотрите фото.

таблица с операциями x86

2 ответа

Решение
mov [ebx], eax               -> answer: [0x100000] 0x40000

Это не меняет значения EAX или же EBX, Только меч в 0x00100000.

lea esp, [ebx+eax*4]         -> answer: esp [0x440000]

Расчет, который выполняется здесь EBX плюс 4 раза EAX,
0x00100000 + 0x00040000 * 4 = 0x00200000

xor edx, edx                 -> answer: edx 0x00000

Правильный.

sub edx, eax                 -> answer: edx 0x40000

Вычитание 0x00040000 из нуля даст вам отрицательный результат. То, что вы написали, является положительным числом!

adc ebx, eax                 -> answer: ebx 0x80000

Добавление 0x00040000 к 0x00100000 дает большее число, чем это: 0x00140000.


Это не слишком сложное упражнение! Просто подумайте о том, что делает каждая операция (посмотрите в руководстве), а затем посчитайте.

xor same,same всегда обнуляет регистр, и это лучший способ сделать это.

Один из канонических вопросов и ответов о LEA Какова цель инструкции LEA?, (TL;DR: это инструкция сдвига и добавления, которая использует синтаксис операнда памяти и машинное кодирование).


Чтобы проверить свои ответы на другие инструкции, просто соберите этот код в исполняемый файл и пошагово выполните его в gdb, наблюдая за изменением значений регистра. Смотрите в нижней части тега x86 вики.


Кстати, "команда" - это неправильное слово для описания инструкции x86. Некоторые языки ассемблера, очевидно, используют "команду" как часть обычной терминологии, но x86 - нет.

Другие вопросы по тегам