64

在哪里可以找到此架构上用于组装的新寄存器的名称?

我指的是 X86 中的寄存器,如 EAX、ESP、EBX 等。但我希望它们是 64 位的。

我认为它们与我反汇编 C 代码时不同,我得到的是 r 而不是 e。

4

4 回答 4

104

MSDN 文档包含有关 x64 寄存器的信息 。

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
于 2009-11-18T04:24:40.223 回答
88

旧的 32 位寄存器已扩展到 64 位,即r寄存器(raxrbxrsp)。

此外,还有一些额外的通用寄存器,也可以r8通过r15它们访问(例如)r8dr8wr8b分别为低 32 位双字、16 位字和 8 位字节)。b后缀是原始的 AMD 命名法,但有时您会看到它写为(l小写L)表示“低字节”。

我自己更喜欢b后缀(即使当前的低字节寄存器是al,bl等),因为它与d/w = double/word名称匹配并且l可能被误认为long. 或者,更糟糕的是,数字1,导致您质疑注册号81是什么:-)

在许多情况下,旧的 16 位寄存器的高字节仍然可以访问,例如ah、等(尽管对于新的直通寄存器bh来说似乎不是这种情况)。有一些新的指令编码,特别是那些使用前缀的,不能访问那些原始的高字节,但其他人仍然可以免费使用它们。r8r15REX

此外,还有一些新的 SSExmm8寄存器xmm15

eipandeflags寄存器也被扩展为ripand rflags(虽然高 32 位目前rflags仍未使用)。

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

特定 C 编译器的关键字是否支持这些asm,我不能说。我所做的小组装(现在大约一年一天)是在组装而不是 C 中完成的。


有关的:

于 2009-11-18T04:21:56.070 回答
9

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或访问英特尔网站上找到有关架构的一些基本信息。

于 2009-11-18T04:22:54.367 回答
5

让我们阅读英特尔手册

在哪里可以找到此架构上用于组装的新寄存器的名称。

在处理器手册“Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture”中,例如版本 253665-053US

  • 搜索“寄存器”
  • 第一个匹配是索引“3.4 BASIC PROGRAM EXECUTION REGISTER”
  • “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 的“兼容模式”。

如果您继续在 TOC 上搜索“寄存器”,您还会在手册中找到有关浮点和 SIMD 的“数字粉碎”寄存器的部分:

  • 8.1.2 - x87 FPU 数据寄存器 (STx)
  • 9.9.2 - MMX 寄存器
  • 10.2.2 - XMM 寄存器
  • 14.1.1 - 256 位宽 SIMD 寄存器支持 (YMM)

还有更多的控制寄存器具有各种副作用,通常不能写入,除非您想要这些效果(并且通常需要 ring 0)。这些在“第 3 卷系统编程指南 - 2.1.6 系统寄存器”中进行了总结,更适合 OS 开发人员。

一个好的经验方法是info all-registers在 GDB 中运行:How to print register values in GDB?

于 2015-04-20T20:12:38.323 回答