2009-11-18 149 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?