2012-02-04 133 views
3

我一直在嘗試在我的linux操作系統上學習32位英特爾x86 nasm語法程序集,並且遇到了關於四個通用32位寄存器的問題。英特爾x86 32位寄存器混淆

從我一直思維,EAX是,本來是要用來 16位的寄存器AX,其中又分爲啊(高8位)的32位寄存器,和人(低8位)。和ebx,ecx和edx一樣。

然而,在閱讀一篇快速文章之後,我變得有些困惑。

32位寄存器是由16位寄存器(又由兩個8位寄存器組成)和另外16位加上的嗎?

從我在Google上看到的結果來看,所有結果都是他們用來做的,而不是他們的實際構成。

回答

4

你完全正確。通用寄存器EAXEBXECXEDX組成如下的四(I用於本例中的儲液器):

  1. 首先,我們有低字節,16位的高字節字。因此,AX = AH || AL
  2. 然後,我們有16位擴展名爲AX,它形成雙字。所以,EAX = EAX(31:16) || AX
  3. (在AMD64中)dword寄存器然後被擴展爲qword寄存器。所以我們有RAX = RAX(63:32) || EAX

||運算符是連接運算符。您應該注意,此規則不適用於其他四個通用寄存器,ESP,EBP,ESIEDI

+0

完美的答案,謝謝你解釋'||'運算符,也用於將答案擴展到AMD64。 – JAW1025 2012-02-04 00:29:08

+1

實際上有SP,BP,SI和DI,它們是ESP,EBP,ESI和EDI的低端部分,它們又與高32位組合,成爲x86_64中的RSP,RBP,RSI和RDI – 2014-01-25 16:04:25

0

當你想,一個32位寄存器,像eax,是在其最顯著的部分訪問,爲axax本身分裂成ahal ...同爲ebx等等...

+0

所以斧頭身體在eax內嗎? (例如,eax的高16位或低16位是擴展,另一半是ax) – JAW1025 2012-02-04 00:27:03

+0

@JAW - * Everything *是擴展名。在時代的黎明時刻,寄存器只是「A」幷包含8位。 – 2012-02-04 08:36:18