x86_64 CPU 实际上有多少个寄存器?

逆向工程 部件 登记 x86-64
2021-06-14 04:54:41

我目前正在学习逆向工程并且正在研究标志寄存器。

我认为这rflags只是 16 个通用寄存器之一的另一个名称,例如raxor rbx

但看起来rflags实际上是一个额外的寄存器。所以总共有 17 个寄存器……还有多少?

我花了至少一个小时来解决这个问题,并找到了许多不同的答案。

到目前为止最好的答案是this,它说总共有 40 个寄存器。

  • 16 个通用寄存器
  • 2 个状态寄存器
  • 6 个代码段寄存器
  • 16 个 SSE 寄存器
  • 8 个 FPU/MMX 寄存器

但是如果我把它加起来,我会得到 48。

任何人都可以提供有关x86_64CPU 有多少个寄存器的官方答案(例如 Intel i7)。

此外,我还看到了对“硬件”和“架构”寄存器的引用。这些寄存器是什么,有多少?

2个回答

维基百科有一个关于 x86 架构及其所有已知寄存器的页面这是一张小图片,收集了我们对它的所有了解。

amd64 寄存器

事实上,并非所有这些寄存器都被正式记录在案。但是,我们知道(以及我们知道如何使用)的所有寄存器都列在图中。而且,它的收入远远超过 40。

而且,我不知道这些“硬件”或“架构”寄存器是什么,因为对我来说它们都是“硬件”(不是软件模拟的)。而且,我们所说的 CPU 架构还包括可用硬件寄存器的列表。所以,据我所知,它们都是硬件和架构寄存器。

编辑

请注意,大多数寄存器都是专用的,并且被引入以支持特定指令集(最好的例子是 FPU 寄存器 ST0-ST7,引入以支持浮点计算)。

我认为 40 和实际总和 48 之间的差异主要是一个错误,但是还有许多其他寄存器用于处理硬件、内存管理和 CPU 不同功能的控制。

您链接的答案涵盖了下图中的所有常用寄存器(取自那里):

常用寄存器

然而,有很多鲜为人知的寄存器。这些寄存器不太可能被用户模式程序使用,而是用于控制和初始化处理器以及 CPU 知道的低级构造。它们控制 CPU 子系统,例如 MMU 单元、任务调度等。这些寄存器的文档可以在AMD64 架构手册中找到

您可以在下图中看到其中的大部分内容,摘自AMD64 架构手册

系统寄存器

不在上图中的是新的扩展控制寄存器系列寄存器,XCR0目前仅对其进行了定义。

系统寄存器是模型特定寄存器的一部分,顾名思义,是模型特定的。CPU 之间的差异也会发生变化。AMD64 架构的完整列表可以在AMD64 架构手册的“附录 A MSR 交叉参考”中找到


扩展扩展了一套特定的基于AMD64位CPU的支持/实现XMM可用的寄存器。AVX-512 中XMM(以及后来的YMMZMM)目前扩展到最多 32 个 512 位的寄存器与通用寄存器类似,寄存器允许访问它们对应物的较低部分XMMYMMZMM

另外还有所谓的“内存映射寄存器”,这基本上意味着这些寄存器是通过内存操作而不是指定指令来访问的。根据您的定义,它们可以被视为寄存器。一个这样的例子是 AMD64 的第 16.3.2 节中描述的“APIC 寄存器”

甚至还有一些内部寄存器不是通过指令集公开的,而是出于性能原因使用的。