Значение (%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
и результат сохраняется по тому же адресу.