新的X86_64处理器寄存器的名称是什么?

Rec*_*ion 54 x86 assembly x86-64 cpu-registers

在哪里可以找到用于此体系结构的新寄存器的名称?

我指的是X86中的寄存​​器,如EAX,ESP,EBX等.但我喜欢它们在64位.

我不认为它们与我拆解C代码时的情况相同,我得到r而不是e.

RRU*_*RUZ 95

MSDN文档包括关于64位寄存器的信息.

x64将x64的8个通用寄存器扩展为64位,并添加了8个新的64位寄存器.64位寄存器的名称以"r"开头,因此例如eax的64位扩展名为rax.新寄存器命名为r8到r15.

每个寄存器的低32位,16位和8位可在操作数中直接寻址.这包括寄存器,如esi,其低8位以前不可寻址.下表指定了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
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 72

旧的32位寄存器被扩展到64位,则r寄存器(rax,rbx,rsp等等).

此外,有一些额外的通用寄存器r8通过r15其也可以访问如(例如)r8d,r8wr8b(低32位双字,16位字和8位字节分别地).

在许多情况下,旧的16位寄存器的高字节仍可访问,因为b,l等等,但这似乎不是L通过b寄存器的情况.有一些新的指令编码,特别是那些使用al前缀的编码,它们无法访问那些高字节,但其他编码仍然可以自由使用它们.

此外,还有一些新的SSE寄存器,bl虽然d/w = double/word.

llong寄存器也被扩展到181.

有关详细信息,请参阅维基百科页面MSDN.

ah对于特定的C编译器的关键字是否支持这些,我不能说.我做的小装配(并且它每年大约变成一天)是在装配而不是装配中完成的.

  • @ int80,不知道.也许`e`意味着扩展,'r`意味着_really_扩展:-) (28认同)
  • "r"代表寄存器,如R8,R9,R10等.对于rax到rbp,"r"表示一致性. (6认同)
  • 这是不正确的。使用“REX”前缀时,不能使用上半部分(“ah”、“bh”、“ch”、“dh”),因为它们映射到其他寄存器的下半部分(“si”、“bp”、分别为“sp”、“di”)。这意味着,如果您在“r8”中存储了一个地址,则无法将“ah”的内容移动到该地址。 (2认同)
  • @Fotis,究竟哪一点“不正确”?如果您指的是 x86-64 无法访问带有 REX 前缀的指令中的上半部分(啊等),这是我什至没有涵盖的限制,尽管我会添加一个简短的说明。这只是意味着 _some_ 指令无法访问那些上半部分,并不意味着寄存器不存在或您根本无法使用它们。而且,只是为了澄清,寄存器本身没有被映射,它是指令编码 - 如果你改变 `sil`,这不会影响 `ah` 内容。 (2认同)

小智 9

X64扩展了32位通用寄存器,如下所示:

EAX -> RAX
EBX -> RBX
ECX -> RCX
EDX -> RDX
ESI -> RSI
EDI -> RDI
ESP -> RSP
EBP -> RBP
Run Code Online (Sandbox Code Playgroud)

X64还添加了以下64位通用寄存器:

R8, R9, R10, R11, R12, R13, R14, R15
Run Code Online (Sandbox Code Playgroud)

此外,SSE是X64规范的一部分,因此也可以使用xmm0-xmm15向量寄存器

您可以在Wikipedia/X86-64上找到有关架构的一些基本信息,或访问英特尔的网站.


Cir*_*四事件 5

让我们阅读英特尔手册

在哪里可以找到要在此体系结构上组装的新寄存器的名称。

在处理器手册“英特尔64和IA-32架构软件开发人员手册第1卷:基本架构”中,例如253665-053US版本

  • 搜索“寄存器”
  • 第一个匹配项是索引“ 3.4基本程序执行寄存器”
  • “ 3.4.1.1 64位模式下的通用寄存器”下面的两项

在该部分:

如果指定了64位操作数大小:RAX,RBX,RCX,RDX,RDI,RSI,RBP,RSP,R8-R15可用。R8D-R 15D / R8-R15代表八个新的通用寄存器。

提醒:64位模式是x86-64中的“正常”模式。另一个主要模式是模拟IA32的“兼容模式”。

如果您继续在目录上搜索“寄存器”,则还会在手册中找到有关浮点数和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开发人员。

一个好的经验方法是info all-registers在GDB中运行:如何在GDB 中打印寄存器值?