2009-11-18 111 views
40

我在哪裏可以找到在此架構上組裝的新寄存器的名稱?新的X86_64處理器寄存器的名稱是什麼?

我指的是X86中的寄存​​器,如EAX,ESP,EBX等,但我希望他們在64位。

我不認爲它們與拆解我的C代碼時相同,我得到r而不是e。

+0

傢伙,我怎樣才能知道做一個系統調用時什麼寄存器關聯到的參數。我一直在閱讀和文檔,並沒有找到明確的答案。 – Recursion 2009-11-20 03:49:00

+0

請注意,舊的高8位寄存器(ah,bh等)不再適用於所有操作碼。例如'inc ah'在x64中無效,因爲該操作碼已被重新​​用於新的64位寄存器之一。 – Johan 2013-09-26 22:55:19

+1

@Johan:還要注意,用REX前綴,ah bh ch dh的寄存器代碼成爲新的字節寄存器sil dil bpl spl – 2013-10-03 07:43:02

回答

57

舊的32位寄存器已擴展到64位,r寄存器(rax,rbx,rsp等)。

此外,有一些額外的通用寄存器r8通過r15,其也可以作爲(例如)r8dr8wr8b(低32位雙字,16位字和8位字節訪問分別)。

舊的16位寄存器的高字節是仍然可以訪問,在很多情況下,爲ahbh,等等,但是這似乎並不爲r8通過r15寄存器的情況。有一些新的指令編碼,特別是那些使用前綴REX,無法訪問這些高字節,但其他人仍然可以自由使用它們。

另外,還有一些新的SSE寄存器,xmm8雖然xmm15

eipflags寄存器也被擴展到riprflags

查看wikipedia pageMSDN瞭解更多詳情。

對於特定的C編譯器,關於asm關鍵字是否支持這些,我不能說。什麼小總成我(和它變得大約一天一年)在組裝,而不是C.做

+0

什麼是「R」? – 2014-10-09 11:21:28

+24

@ int80,不知道。也許'e'意味着擴展和'r'意思是_really_擴展:-) – paxdiablo 2014-10-09 11:43:26

+1

我知道「e」代表擴展(從16位)。但r?但你的答案只是邏輯%) – 2014-10-09 13:40:02

8

X64擴展了32位通用寄存器如下:

EAX -> RAX 
EBX -> RBX 
ECX -> RCX 
EDX -> RDX 
ESI -> RSI 
EDI -> RDI 
ESP -> RSP 
EBP -> RBP 

X64還增加了以下的64位通用寄存器:

R8, R9, R10, R11, R12, R13, R14, R15 

另外,SSE是X64規範的一部分,因此XMM0-XMM15向量寄存器可以及

您可以在Wikipedia/X86-64找到關於架構的一些基本信息,或者訪問英特爾網站。

79

MSDN documentation包含有關x64寄存器的信息。

64延伸64的8個通用寄存器 爲64位,並增加了8個新 64位寄存器。 64位寄存器 的名稱以「r」開頭,因此對於 示例,eax的64位擴展名爲 ,稱爲rax。新的寄存器是 ,命名爲r8到r15。

每個寄存器的低32位,16位和8位 都是直接在操作數中可尋址的 。這包括 寄存器,如esi,其以前的地址不可尋址。 下表爲64位寄存器的低位 部分指定了 彙編語言名稱。

64-bit register | Lower 32 bits | Lower 16 bits | Lower 8 bits 
============================================================== 
rax    | eax   | ax   | al 
rbx    | ebx   | bx   | bl 
rcx    | ecx   | cx   | cl 
rdx    | edx   | dx   | dl 
rsi    | esi   | si   | sil 
rdi    | edi   | di   | dil 
rbp    | ebp   | bp   | bpl 
rsp    | esp   | sp   | spl 
r8    | r8d   | r8w   | r8b 
r9    | r9d   | r9w   | r9b 
r10    | r10d   | r10w   | r10b 
r11    | r11d   | r11w   | r11b 
r12    | r12d   | r12w   | r12b 
r13    | r13d   | r13w   | r13b 
r14    | r14d   | r14w   | r14b 
r15    | r15d   | r15w   | r15b 
+0

這很清楚,但是對於其他8個通用寄存器,低8位模式似乎對我的intel x86-64 cpu上的'r8'〜'r15'無效。 ''rax'''rdx'支持在'高'模式下訪問8位,意味着使用'ah'〜'dh'訪問16位模式中最重要的8位。 – 2016-06-01 04:28:26

+0

@EricWang:你是否嘗試過使用'mov ah,r8b'或其他東西?您不能使用帶REX前綴的高8寄存器。 'REX mov ah,0'是'mov spl,0'等等(當AH有REX前綴時,AH/CH/DH/BH的編碼表示爲'spl/bpl/sil/dil'在機器代碼中) – 2017-11-23 11:50:20

4

我在哪裏可以找到新的寄存器的名字在此架構組件。

處理器手冊「英特爾64和IA-32體系結構軟件開發人員手冊卷1:基本體系結構」,例如version 253665-053US

  • 搜索「寄存器」
  • 的第一場比賽是索引「3.4 BASIC程序的執行REGISTER」下面的「在64位模式3.4.1.1通用寄存器」
  • 兩個項目

在該節:

如果指定一個64位操作數大小是:RAX,RBX,RCX, RD X,RDI,RSI,RBP,RSP,R8-R15可供選擇。 R8D-R 15D/R8-R15代表8個新的通用寄存器。

提醒:64位模式是x86-64中的「正常」模式。另一個主要模式是模擬IA32的「兼容模式」。

如果你繼續尋找在TOC「註冊」,你還會發現浮點和SIMD分散手冊的有關章節「號粉碎」寄存器:

  • 8.1.2 - 的x87 FPU數據寄存器(STX)
  • 9.9.2 - MMX寄存器
  • 10.2.2 - XMM寄存器
  • 14.1.1 - 256位寬SIMD註冊支援(YMM)

還有更多的控制寄存器會產生各種副作用,除非您想要這些效果(通常需要響鈴0),否則通常無法寫入。這些內容在「第3卷系統編程指南 - 2.1.6系統寄存器」中進行了概述,這些內容更多用於OS開發人員。

一個好的經驗方法是在GDB運行info all-registersHow to print register values in gdb?

相關問題