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

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

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

3
Konnor 10 Окт 2014 в 03:17
1
 – 
Cody Gray
24 Дек 2016 в 18:04

2 ответа

Лучший ответ

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

OFFSET(BASE REGISTER, INDEX REGISTER, INDEX SCALE)

Поэтому представленный адрес представляет собой значение БАЗОВЫЙ РЕГИСТР (если есть) + ИНДЕКС * МАСШТАБ (если есть) + СМЕЩЕНИЕ, поэтому

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

6
500 - Internal Server Error 24 Фев 2022 в 15:22
Ebx в этом случае равен 1, а другой адрес равен -1, поэтому в этом случае он должен быть 3, но, к сожалению, он не работает.
 – 
Konnor
10 Окт 2014 в 04:48
Что ты знаешь the other address? Если ebx равно 1, то эффективным адресом здесь является 0x80498d8. Значение в eax сравнивается со значением по этому адресу.
 – 
500 - Internal Server Error
10 Окт 2014 в 11:03
@Konnor: что именно вы имеете в виду под «это не работает»? Будьте точны, т.е. вы получаете сообщение об ошибке, и если да, то что именно, или ничего не происходит, или что? Если ничего не произойдет, что именно вы ожидаете? Я предполагаю, что есть больше ассемблерного кода. Разместите немного больше этого (точно, т.е. скопируйте и вставьте).
 – 
Rudy Velthuis
10 Окт 2014 в 11:48
Прошу прощения за неясность, это двоичная программа бомбы, так что это строка, которая в основном определяет, взорвется бомба или нет, что я проследил. Таким образом, пользовательский ввод попадает в %eax, и мне нужна эта команда сравнения, чтобы установить нулевой флаг. Так что я запутался, как все это работает, потому что 0x80498d4 имеет значение 0xffffffff, то есть -1 в дополнении 2, поэтому мне просто нужно выяснить, как на самом деле работает это утверждение, чтобы я мог обезвредить бомбу. Я надеюсь, что это прояснит, чего я пытаюсь достичь.
 – 
Konnor
11 Окт 2014 в 02:04
На самом деле @ 500-InternalServerError Я только что заметил ваш комментарий, и он сработал! Спасибо, парни!
 – 
Konnor
11 Окт 2014 в 02:09

Это синтаксис AT&T:

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

Эквивалент в синтаксисе Intel:

cmp [080498D4H + EBX*4],EAX

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

3
Rudy Velthuis 10 Окт 2014 в 11:54