Как можно проверить вывод команд 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 Чтобы увидеть полный список операций в таблице, пожалуйста, смотрите фото.
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 - нет.