2014-10-09 2 views
0

у меня есть следующая строка в x86 ассемблере, что я не знаю, что он делает ...CMP в x86 со скобками и адрес

cmp %eax,0x80498d4(,%ebx,4) 

Я знаю, что сравнивая две половины заявления, но я не знаю, что делает адрес в нем и что делают круглые скобки. Некоторые разъяснения были бы очень признательны!

+0

Возможный дубликат [Что означает запятая в скобках в синтаксисе AT & T для сборки x86?] (Http://stackoverflow.com/questions/18650093/what-does-a-comma-in-a-parenthesis -mean-in-the-att-syntax-for-x86-assembly) –

ответ

2

В AT & T синтаксиса эта форма представляет

OFFSET (базовый регистр, индексный регистр, ИНДЕКС МАСШТАБ)

поэтому адрес представляется этого значение базового регистра (если он присутствует) + ИНДЕКС * МАСШТАБА (если есть) + OFFSET, поэтому

EBX * 4 + 0x80498d4 в вашем случае.

+0

Ebx в этом случае равен 1, а другой адрес равен -1, поэтому в этом случае он должен быть 3, но, к сожалению, он не работает. – Konnor

+0

Что вы называете «другим адресом»? Если 'ebx' равно 1, то здесь эффективный адрес -' 0x80498d8'. Значение в 'eax' сравнивается со значением по этому адресу. –

+0

@ Konnor: что именно вы имеете в виду, «это не работает»? Будьте точны, т. Е. Вы получите сообщение об ошибке, и если да, то что именно это, или ничего не происходит, или что? Если ничего не произойдет, что именно вы ожидаете? Я предполагаю, что есть еще код ассемблера. Поместите немного больше (точно, то есть скопируйте и вставьте). –

0

То есть при & T синтаксис:

cmp %eax,0x80498d4(,%ebx,4) 

эквивалент в синтаксисе Intel является:

cmp [080498D4H + EBX*4],EAX 

Это означает, что он сравнивает содержание DWORD по адресу [0x80498D4 + 4*EBX] с содержанием EAX зарегистрировать и установить флаги процессора как будто эти два значения были вычтены друг из друга. После этого вы можете использовать эти флаги для выполнения, например, условного перехода.