Подтвердить что ты не робот

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

Вы должны извинить меня, я совершенно новый для сборки x86 и сборки в целом.

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

addl %edx,(%eax)

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

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

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

Я очень ценю любую помощь!

4b9b3361

Ответ 1

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

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

addl %edx, %eax

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

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