2012-06-12 879 views
15

隨着x86處理器架構從8位更改爲16位到32位,現在改爲64位,x86彙編語言不得不改變。我知道,在32位彙編器寄存器名稱(EAX,EBX等)中,每個名稱的E前綴表示擴展的寄存器的32位格式,而不是16位格式(AX,BX等) )。R在RAX,RBX,RCX,RDX,RSI,RDI,RBP,RSP中代表什麼?

這些寄存器名稱的R前綴代表64位的含義是什麼?

+10

「R」真的很大? :-) –

+4

當然'X'也代表擴展。 A,B,C和D起始爲8位寄存器。 :-) –

+1

有趣的事實:一位AMD架構師表示,寄存器名稱是進行寄存器擴展的最難的部分之一:他們[考慮將原始8個寄存器重命名爲r0-r7,或給出「上部」寄存器名稱,如'UAX'] (http://www.x86-64.org/pipermail/discuss/2000-September/000283.html)。 –

回答

15

我認爲這只是用於「寄存器」的R,因爲在x86-64上還有其他寄存器R8-R15,而R是許多寄存器編號的CPU架構上的通用前綴。

+0

你提到的那些寄存器(R8-R15)是32位的嗎? –

+0

沒關係我只是讀它們都是64位,所以我假設32位仿真將使用相同的寄存器和一半的空格0'd出 –

+2

從我讀到的,「R」系列寄存器的32位訪問結果在上32位被自動清零。 –

4

最初的英特爾x86處理器8080處理器是8位處理器,專用於諸如特殊用途,小型計算機(例如現金寄存器)或設備控制器而非通用計算機(競爭對手包括摩托羅拉6800)。以下8086處理器系列(8086和成本降低8088)是16位微處理器,繼續使用英特爾8080架構,同時擴展16位加法器,並着眼於處理器的更多通用用途。

英特爾8080和英特爾8086處理器的寄存器數量有限,其中大多數都有特殊用途,因此它們的彙編語言中具有特定的名稱,如A,B或AX,BX(競爭對手,如Motorola 6800有類似的慣例)。通用計算機(如IBM 360/370系列或DEC VAX)對寄存器等組件(例如R0,R1等)使用更通用的名稱,因爲寄存器是通用的(摩托羅拉68000 32位處理器用於許多高端工作站在八十年代與八個數據寄存器D0到D7類似)。

隨着英特爾自20世紀70年代以來不斷髮展x86處理器,它也試圖保持向後兼容性,即使x86的目標應用已經從專用的微控制器應用擴展到通用計算機。在此過程中,寄存器數量不斷增加,許多原本特殊用途的寄存器已朝着通用目的使用,因爲英特爾還引入了80286處理器芯片工作模式的思想,以幫助實現向後兼容性。

對於64位處理器,Intel需要某種方式來識別64位傳輸與彙編語言中的32位或其他傳輸。與此同時,英特爾還推出了其他通用寄存器。對通用寄存器使用通用的行業命名約定,字母R後跟一個數字是一個簡單的決定。

但是,英特爾也面臨着不得不保持舊寄存器的向後兼容性。所以字母R被用作16位寄存器名稱的前綴,就像32位處理器一樣,字母E被用作16位寄存器名稱的前綴。與此同時,64位寄存器操作的設計與上一代32位寄存器操作的設計有所不同。

隨着從8位處理器到16位處理器的變化,寄存器從8位擴展到16位,因此名稱在寄存器名稱後面有字母X,例如AX,BX等。可以處理這些寄存器作爲兩個8位寄存器(16位AX寄存器由8位AH和8位AL組成,其中H代表AX寄存器的高位或最高位,而L代表AX寄存器的低位或最低位)。

隨着從16位到32位處理器的更改,寄存器從16位擴展到32位,因此這些名稱的字母E作爲前綴,如EAX,EBX等。這些寄存器可被視爲具有兩個獨立的16位組件(使用16位名稱訪問的最低有效16位,例如EAX-> AX,EBX-> BX等)或四個8位寄存器(最低有效16位訪問爲當使用寄存器移位和按位操作在32位的高位16位和低位16位之間移動16位值時,兩個8位寄存器(例如EAX-> AH和AL,EBX-> BH和BL等)寄存器,例如EAX,EBX等。這在某種程度上保持了從8位到16位的變化,但直接訪問32位寄存器的高16位不可用,直接訪問已經提供了8086/8080中16位寄存器的高8位。

第1卷的第3.7.2.1節:Intel 64和IA-32架構軟件開發人員手冊的基本架構,其中有64位模式。

Register operands in 64-bit mode can be any of the following: 
• 64-bit general-purpose registers (RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP, or R8-R15) 
• 32-bit general-purpose registers (EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, or R8D-R15D) 
• 16-bit general-purpose registers (AX, BX, CX, DX, SI, DI, SP, BP, or R8W-R15W) 
• 8-bit general-purpose registers: AL, BL, CL, DL, SIL, DIL, SPL, BPL, and R8L-R15L are available using REX 
prefixes; AL, BL, CL, DL, AH, BH, CH, DH are available without using REX prefixes. 
• Segment registers (CS, DS, SS, ES, FS, and GS) 
• RFLAGS register 
• x87 FPU registers (ST0 through ST7, status word, control word, tag word, data operand pointer, and instruction 
pointer) 
• MMX registers (MM0 through MM7) 
• XMM registers (XMM0 through XMM15) and the MXCSR register 
• Control registers (CR0, CR2, CR3, CR4, and CR8) and system table pointer registers (GDTR, LDTR, IDTR, and 
task register) 
• Debug registers (DR0, DR1, DR2, DR3, DR6, and DR7) 
• MSR registers 
• RDX:RAX register pair representing a 128-bit operand 

見問題和答案x86_64 registers rax/eax/ax/al overwriting full register contents以及Why do most x64 instructions zero the upper part of a 32 bit register其提供關於64位寄存器操作如何從32位寄存器的操作的不同一些解釋。

+2

AMD設計AMD64,而英特爾致力於IA-64(Itanium)。直到x86-64發佈(部分歸功於AMD第一款AMD64微架構K8的高性能),英特爾將其添加到P4,然後將其添加到P6(在Core2中),稱其爲「IA-32e」。 –

+0

@PeterCordes,謝謝你的澄清。閱讀「英特爾軟件開發人員手冊」中的簡要歷史記錄,提到64位首次出現在英特爾處理器的高端版本中,並在下一次迭代中可用。我不確定IA-64安騰與P4和P6有何區別。 Itanium似乎主要是一個企業服務器類的處理器。 –

+2

IA-64是一個完全獨立的體系結構,而不是x86。 P4是針對高時鐘速度而非高性能進行了優化的Pentium 4,[「netburst」微體系結構](https://en.wikipedia.org/wiki/NetBurst_(微體系結構)),因爲那時CPU仍然上市以時鐘速度。 [P6是以Pentium Pro/Pentium II開始的微體系結構系列](https://en.wikipedia.org/wiki/P6_(微體系結構)),並最終在Nehalem。 ([Sandybridge是一個新的微架構家族](http://www.realworldtech.com/sandy-bridge/)。) –

相關問題