Почему эта инструкция CMP не работает?
У меня есть следующий код:
CMP BYTE PTR [ESP+5],61 ; ESP is 0012F9AC
JNZ SHORT ....
Следующее в памяти
Address Data
0012F9AC 0012FA94
0012F9B0 61616161
0012F9B4 61616161
Теперь, насколько я понимаю, он сравнивает 0x61 со значением в (0x0012F9AC + 5), которое составляет 0x12F9B1. Согласно дампу памяти значение по адресу 0x12F9B1 равно 0x61. Так почему же он все еще настаивает на прыжке?
3 ответа
Извините, но не эксперт по сборке, но разве 61 действительно 0x61? Вы можете попробовать,97, как быструю проверку.
Обновление: я вижу, что черный дрозд попал туда первым с тем же комментарием.
Стек выровнен по DWORD. Обратите внимание на ваш адрес 2-х строк, они разделены DWORD. То, что у вас есть указатели, так что, конечно, это не будет совпадать.
[esp] == return address
[esp + 4] == pointer to first string
[esp + 8] == pointer to second string
Попробуй это:
DoIt:
mov eax, [esp + 4]
cmp byte ptr [eax], 061H
jnz NotA
PrintText "a"
jmp Over
NotA:
PrintText "NOT A"
Over:
ret 4 * 2
Теперь я могу просто inc eax
чтобы получить следующий персонаж.
Не уверен в вашем контексте, поэтому я создал тестовый процесс и передал ему 2 строки.
Скажем так: вы хотите коробку - esp, или вы хотите, что находится в коробке [esp]?
Оригинальный вопрос цитирует это:
Address Data
0012F9AC 0012FA94
0012F9B0 61616161
0012F9B4 61616161
Это ясно показывает следующие моменты:
- Это дамп памяти в шестнадцатеричном формате.
- Память, начинающаяся с 0012F9B0, заполняется 8-ю строчными буквами "a" ( 1 байт на символ)
Ответ, данный Ганнером, является полностью поддельным для этого вопроса. Эти "а" прямо здесь, а не указатели на них!
Однако, как отмечают другие, любой порядочный ассемблер, когда видит эту строчку:...
CMP BYTE PTR [ESP + 5], 61; ESP - 0012F9AC
... они будут интерпретировать ",61" как десятичное число, поэтому сравнение не удастся, потому что 61 десятичное число не равно 61 шестнадцатеричному. Это реальная причина, почему сравнение не удастся.
Просто исправьте вот так:
CMP BYTE PTR [ESP + 5], 61 ч; ESP - 0012F9AC
и проблема решена.