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

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

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

addl %edx,(%eax)

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

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

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

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

1 ответ

Решение

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

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

addl %edx, %eax

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

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

Другие вопросы по тегам