Значение (% eax) в синтаксисе AT & T?
-
06-07-2019 - |
Вопрос
Извините, я новичок в сборке x86 и сборке в целом.
Итак, мой вопрос, у меня есть что-то вроде:
addl %edx,(%eax)
% eax - это регистр, который содержит указатель на некоторое целое число. Давайте назовем это хр
Значит ли это, что он говорит: * xp = * xp +% edx
? (% edx
является целым числом)
Я просто запутался, где addl будет хранить результат. Если % eax
является указателем на int, тогда (% eax)
должно быть фактическим значением этого int. Так будет ли addl
хранить результат % edx + (% eax)
в * xp
? Мне бы очень хотелось, чтобы кто-то объяснил мне это!
Я очень ценю любую помощь!
Решение
Да, эта инструкция делает именно то, что вы думаете.
В большинстве арифметических инструкций x86 используются два операнда: источник и пункт назначения. В синтаксисе AT & amp; T (используемом здесь) адресат всегда является правильным операндом. Так что с такой инструкцией:
addl %edx, %eax
значения в edx
и eax
складываются вместе, а результат сохраняется в eax
. Однако в вашем примере (% eax)
является операндом памяти; это то, что означают скобки в синтаксисе AT & T (как в квадратных скобках в синтаксисе NASM).
Это означает, что eax
обрабатывается как указатель, поэтому правый операнд берется из адреса, на который указывает eax
, и результат сохраняется по тому же адресу . р>