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

Ще трябва да ме извините, аз съм съвсем нов в асемблирането на x86 и асемблирането като цяло.

Та въпросът ми е, имам нещо като:

addl %edx,(%eax)

%eax е регистър, който съдържа указател към някакво цяло число. Нека го наречем xp

Това означава ли, че казва: *xp = *xp + %edx? (%edx е цяло число)

Просто съм объркан къде addl ще съхранява резултата. Ако %eax е указател към int, тогава (%eax) трябва да бъде действителната стойност на това int. Така че addl ще съхрани ли резултата от %edx+(%eax) в *xp? Много ще се радвам някой да ми обясни това!

Наистина оценявам всяка помощ!


person kodai    schedule 24.10.2009    source източник


Отговори (1)


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

Повечето x86 аритметични инструкции приемат два операнда: източник и дестинация. В синтаксиса на AT&T (използван тук) дестинацията винаги е правилният операнд. Така че с инструкция като:

addl %edx, %eax

стойностите в edx и eax се събират заедно и резултатът се съхранява в eax. Във вашия пример обаче (%eax) е операнд на паметта; това означават скобите в синтаксиса на AT&T (като квадратните скоби в синтаксиса на NASM).

Това означава, че eax се третира като указател, така че десният операнд се взема от адреса, към който сочи eax, и резултатът се съхранява на същия адрес.

person Jay Conrod    schedule 24.10.2009
comment
(%eax) е индиректен регистър, ако искате да назовете различни режими на адресиране изобщо. Непрякото адресиране на паметта е, когато процесорът зарежда адрес от паметта и след това дереферира това (x86 не поддържа индиректно адресиране на паметта). en.wikipedia.org/wiki/Addressing_mode#Memory_indirect - person Peter Cordes; 18.09.2017