У меня есть следующая строка на языке ассемблера x86, и я не знаю, что она делает ...
cmp %eax,0x80498d4(,%ebx,4)
Я знаю, что он сравнивает две половины утверждения, но я не знаю, что в нем делает адрес и что делают скобки. Будем очень признательны за некоторые пояснения!
2 ответа
В синтаксисе AT&T эта форма представляет
OFFSET(BASE REGISTER, INDEX REGISTER, INDEX SCALE)
Поэтому представленный адрес представляет собой значение БАЗОВЫЙ РЕГИСТР (если есть) + ИНДЕКС * МАСШТАБ (если есть) + СМЕЩЕНИЕ, поэтому
EBX*4 + 0x80498d4
в вашем случае.
the other address
? Если ebx
равно 1, то эффективным адресом здесь является 0x80498d8
. Значение в eax
сравнивается со значением по этому адресу.
Это синтаксис AT&T:
cmp %eax,0x80498d4(,%ebx,4)
Эквивалент в синтаксисе Intel:
cmp [080498D4H + EBX*4],EAX
Это означает, что он сравнивает содержимое DWORD по адресу [0x80498D4 + 4*EBX]
с содержимым регистра EAX
и устанавливает флаги процессора как если бы эти два значения были вычтены друг из друга. После этого вы можете использовать эти флаги, например, для условного перехода.
Похожие вопросы
Связанные вопросы
Новые вопросы
assembly
Вопросы по языку ассемблера. Отметьте процессор и/или набор инструкций, которые вы используете, а также ассемблер, допустимый набор должен быть таким: ([assembly] [x86] [gnu-assembler] или [att]). Вместо этого используйте тег [.net-assembly] для сборок .NET, [cil] для языка ассемблера .NET и вместо байт-кода Java используйте тег java-bytecode-asm.