Значение (% eax) в синтаксисе AT&T?

Извините, я новичок в сборке x86 и сборке в целом.

Итак, мой вопрос, у меня есть что-то вроде:

addl %edx,(%eax)

% eax - это регистр, содержащий указатель на некоторое целое число. Назовем это xp

Означает ли это, что он говорит: *xp = *xp + %edx? (%edx - целое число)

Я просто запутался, где addl сохранит результат. Если %eax является указателем на int, тогда (%eax) должно быть фактическим значением этого int. Так будет ли addl сохранять результат %edx+(%eax) в *xp? Мне бы очень хотелось, чтобы кто-нибудь мне это объяснил!

Я очень ценю любую помощь!


person kodai    schedule 24.10.2009    source источник


Ответы (1)


Да, эта инструкция делает именно то, что вы думаете.

Большинство арифметических инструкций x86 принимают два операнда: источник и место назначения. В синтаксисе AT&T (используемом здесь) местом назначения всегда является правильный операнд. Итак, с инструкцией вроде:

addl %edx, %eax

значения в edx и eax складываются, и результат сохраняется в eax. Однако в вашем примере (%eax) - это операнд памяти; это то, что означают круглые скобки в синтаксисе AT&T (например, квадратные скобки в синтаксисе NASM).

Это означает, что eax рассматривается как указатель, поэтому правый операнд берется из адреса, на который указывает eax, и результат сохраняется по тому же адресу.

person Jay Conrod    schedule 24.10.2009
comment
(%eax) является косвенным регистром, если вы хотите вообще назовите разные режимы адресации. Косвенная адресация памяти - это когда ЦП загружает адрес из памяти, а затем разыменовывает этот (x86 не поддерживает косвенную адресацию памяти). en.wikipedia.org/wiki/Addressing_mode#Memory_indirect - person Peter Cordes; 18.09.2017