2009-10-24 17 views
26

Özür dilerim, x86 montajında ​​yepyeni ve genel olarak montaj yapıyorum.AT & T sözdiziminin (% eax) anlamı nedir?

addl %edx,(%eax) 

% eax bazı tamsayıya bir işaretçi tutan bir kayıt geçerli:

Benim soru ben böyle bir şey olması. Diyelim ki buna *xp = *xp + %edx diyoruz? (%edx bir tamsayıdır)

Yalnızca eklentinin sonuçları depolayacağı yerde kafam karıştı. %eax bir int için bir işaretçi ise, o zaman bu int gerçek değeri (%eax) olmalıdır. addl%edx+(%eax) sonucunu *xp içinde saklar mı? Bunu bana açıklayacak birini gerçekten çok isterim!

Gerçekten herhangi bir yardım için minnettarım!

cevap

50

Evet, bu komut tam olarak ne yaptığınızı düşünüyor.

Çoğu x86 aritmetik yönergesi iki işlenen alır: bir kaynak ve bir hedef. AT & T sözdiziminde (burada kullanılır), hedef her zaman doğru işlenendir. gibi bir komutla Yani: edx ve eax yılında

addl %edx, %eax 

değerler birbirine eklenir ve sonuç eax saklanır. Ancak, örneğinizde, (%eax) bir bellek işlenendir; Bu, parantezin AT & T sözdiziminde anlamıdır (NASM sözdiziminde köşeli parantezler gibi).

Bu, eax'un bir işaretçi olarak kabul edildiği anlamına gelir, bu nedenle sağ işlenen eax ile gösterilen adresten alınır ve sonuç aynı adreste depolanır.

+0

+1 güzel basit bir yanıt. [Farklı adresleme modlarını adlandırmak istiyorsanız] –

+0

'(% eax)', “register dolaylı” dır (https://stackoverflow.com/questions/46257018/do-terms-like-direct-indirect-addressing-mode- fiilen var olan-in-the-intel-x86-man). "Bellek dolaylı" adresleme, CPU bir adresi bellekten yüklediğinde ve sonra da * (x86, bellek dolaylı adreslemeyi desteklemez) dereferences'tır. https://en.wikipedia.org/wiki/Addressing_mode#Memory_indirect –