隨着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位的含義是什麼?
隨着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位的含義是什麼?
我認爲這只是用於「寄存器」的R,因爲在x86-64上還有其他寄存器R8-R15,而R是許多寄存器編號的CPU架構上的通用前綴。
你提到的那些寄存器(R8-R15)是32位的嗎? –
沒關係我只是讀它們都是64位,所以我假設32位仿真將使用相同的寄存器和一半的空格0'd出 –
從我讀到的,「R」系列寄存器的32位訪問結果在上32位被自動清零。 –
最初的英特爾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位寄存器的操作的不同一些解釋。
AMD設計AMD64,而英特爾致力於IA-64(Itanium)。直到x86-64發佈(部分歸功於AMD第一款AMD64微架構K8的高性能),英特爾將其添加到P4,然後將其添加到P6(在Core2中),稱其爲「IA-32e」。 –
@PeterCordes,謝謝你的澄清。閱讀「英特爾軟件開發人員手冊」中的簡要歷史記錄,提到64位首次出現在英特爾處理器的高端版本中,並在下一次迭代中可用。我不確定IA-64安騰與P4和P6有何區別。 Itanium似乎主要是一個企業服務器類的處理器。 –
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/)。) –
「R」真的很大? :-) –
當然'X'也代表擴展。 A,B,C和D起始爲8位寄存器。 :-) –
有趣的事實:一位AMD架構師表示,寄存器名稱是進行寄存器擴展的最難的部分之一:他們[考慮將原始8個寄存器重命名爲r0-r7,或給出「上部」寄存器名稱,如'UAX'] (http://www.x86-64.org/pipermail/discuss/2000-September/000283.html)。 –