新的X86_64处理器寄存器的名称是什么?
我在哪里可以找到在此架构上组装的新寄存器的名称?新的X86_64处理器寄存器的名称是什么?
我指的是X86中的寄存器,如EAX,ESP,EBX等,但我希望他们在64位。
我不认为它们与拆解我的C代码时相同,我得到r而不是e。
旧的32位寄存器已扩展到64位,r
寄存器(rax
,rbx
,rsp
等)。
此外,有一些额外的通用寄存器r8
通过r15
,其也可以作为(例如)r8d
,r8w
和r8b
(低32位双字,16位字和8位字节访问分别)。
旧的16位寄存器的高字节是仍然可以访问,在很多情况下,为ah
,bh
,等等,但是这似乎并不为r8
通过r15
寄存器的情况。有一些新的指令编码,特别是那些使用前缀REX
,无法访问这些高字节,但其他人仍然可以自由使用它们。
另外,还有一些新的SSE寄存器,xmm8
虽然xmm15
。
的eip
和flags
寄存器也被扩展到rip
和rflags
。
查看wikipedia page和MSDN了解更多详情。
对于特定的C编译器,关于asm
关键字是否支持这些,我不能说。什么小总成我(和它变得大约一天一年)在组装,而不是C.做
什么是“R”? – 2014-10-09 11:21:28
@ int80,不知道。也许'e'意味着扩展和'r'意思是_really_扩展:-) – paxdiablo 2014-10-09 11:43:26
我知道“e”代表扩展(从16位)。但r?但你的答案只是逻辑%) – 2014-10-09 13:40:02
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找到关于架构的一些基本信息,或者访问英特尔网站。
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
这很清楚,但是对于其他8个通用寄存器,低8位模式似乎对我的intel x86-64 cpu上的'r8'〜'r15'无效。 ''rax'''rdx'支持在'高'模式下访问8位,意味着使用'ah'〜'dh'访问16位模式中最重要的8位。 – 2016-06-01 04:28:26
@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
我在哪里可以找到新的寄存器的名字在此架构组件。
在处理器手册“英特尔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-registers
:How to print register values in gdb?
家伙,我怎样才能知道做一个系统调用时什么寄存器关联到的参数。我一直在阅读和文档,并没有找到明确的答案。 – Recursion 2009-11-20 03:49:00
请注意,旧的高8位寄存器(ah,bh等)不再适用于所有操作码。例如'inc ah'在x64中无效,因为该操作码已被重新用于新的64位寄存器之一。 – Johan 2013-09-26 22:55:19
@Johan:还要注意,用REX前缀,ah bh ch dh的寄存器代码成为新的字节寄存器sil dil bpl spl – 2013-10-03 07:43:02