2015-08-29 2 views
1

У меня есть функция в MASM x86 без пролога. Я хочу сравнить аргумент в стеке, который был передан функции.Как сравнить esp в masm x86?

.MODEL flat 
extern x:dword 

foo proc 
cmp esp+4, x 
... 
foo endp 

Я попытался DWORD PTR [esp+4],x как хорошо, но это не работает. Я не хочу вмешиваться в высказывание из стека или что-то еще, потому что это просто функция пересылки. Мой вопрос в основном почему я не могу сделать сравнение напрямую с arg в стек против глобальной переменной? Если это невозможно, сообщите мне другой способ решить эту проблему.

ответ

4

x86 dooes не поддерживает прямое сравнение двух мест памяти. Вам нужно переместить одну из них в регистр (предпочтительно eax) первым, а затем сравнить с помощью регистра:

MOV EAX, x 
CMP DWORD PTR [ESP + 4], EAX 
+0

Я не уверен, если он хочет, чтобы сравнить [ESP + 4] на слово хранится по адресу х или по адресу x. Последняя инструкция будет «cmpl $ x, 4 (% esp)» в синтаксисе AT & T. Это была бы одна инструкция (кодированная как 81 7c 24 04 xx xx xx xx) и не нуждающаяся в дополнительном регистре - к сожалению, я не знаю синтаксиса NTASM. MAYBE это будет "cmp dword ptr [esp + 4], offset x" ... –

+1

@MartinRosenau Yup, если он захочет сравнить с адресом 'x', он наверняка написал бы« offset x »или что-то с инструкция 'lea'. – Downvoter

+0

@MichaelPetch Я действительно не понимаю, что вы имеете в виду. 'DWORD PTR [esp + 4]' получает 'DWORD' в' esp + 4', т. Е. Указывается ** **. Или вы имеете в виду еще один уровень косвенности? – Downvoter