Вопрос

Извините, я новичок в сборке 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 , и результат сохраняется по тому же адресу .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top