Значение (% eax) в синтаксисе AT & T? - PullRequest
27 голосов
/ 25 октября 2009

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

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

addl %edx,(%eax)

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

Значит ли это, что он говорит: *xp = *xp + %edx? (%edx является целым числом)

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

Я действительно ценю любую помощь!

1 Ответ

51 голосов
/ 25 октября 2009

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

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

addl %edx, %eax

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

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

...