Есть ли разница между %eax(,%edx,$4) и (%eax,%edx,$4) в ассемблере?

Я просто хочу знать, есть ли разница между этими способами вычисления некоторого значения (числового значения или адреса). %eax(,%edx,$4) и (%eax,%edx,$4)

насколько я понимаю, они добавляют do %edx * 4 + %eax Тогда я не уверен, хотели бы мы использовать один способ вместо другого в определенных ситуациях. Спасибо


person UserMoon    schedule 29.10.2014    source источник
comment
Они должны быть одинаковыми, если ваш ассемблер поддерживает оба. Лично я никогда не видел первую форму, только вторую. Обычно вы пишете постоянное смещение вне (), базовый регистр должен быть первым элементом внутри.   -  person Jester    schedule 29.10.2014


Ответы (1)


Оба недействительны. Масштабный коэффициент не должен иметь $.

(%eax,%edx,4) является допустимым и соответствует синтаксису Intel [eax + edx*4].

Но %eax(,%edx,4) тоже недействителен. Вы могли бы просто попробовать это:

$ cat > foo.S
mov %eax,  %eax(,%edx,4)
(control-D)
$ gcc -c foo.S
foo.S: Assembler messages:
foo.S:1: Error: junk `(,%edx,4)' after register

Или с лязгом:

foo.S:1:15: error: unexpected token in argument list
mov %eax, %eax(,%edx,4)
              ^

Или http://godbolt.org/ имеет исходный режим сборки, или вы можете использовать его в операторе asm(""); в С++.

person Peter Cordes    schedule 18.08.2018