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

我想到rflags只是16个通用寄存器之一的另一个名称,例如raxrbx

但看起来rflags实际上是一个附加寄存器。这样一来,总共就有17个寄存器...还能有多少个寄存器?

我花了至少一个小时的时间,并找到了许多不同的答案。

最好的到目前为止,答案是这样,即总共有40个寄存器。


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

但是如果加起来,我得到48个。一个x86_64 CPU具有(例如Intel i7)。此外,我还看到了对“硬件”和“体系结构”寄存器的引用。这些寄存器是什么,有多少?

评论

如果您知道CPU有10000个寄存器,但实际上只能使用其中的40个寄存器,那么它有什么用? ...

尽管OP正在学习逆向工程,但是这个问题尤其与逆向工程无关。

x86-64处理器有多少个寄存器?

#1 楼

维基百科上有一个有关x86体系结构及其所有已知寄存器的页面。这是一张小图,收集了我们所知道的所有信息。但是,图片中列出了我们知道(并且我们知道如何使用)的所有寄存器。而且,它的数量远远超过40。

而且,我不知道这些“硬件”或“体系结构”寄存器是什么,因为对我而言,它们都是“硬件”(不是模拟的软件)。而且,我们所谓的CPU体系结构还包括可用硬件寄存器的列表。因此,据我所知,它们都是硬件寄存器和体系结构寄存器。设置(最好的例子是FPU寄存器ST0-ST7,引入来支持浮点计算)。

评论


我喜欢您说“已知”寄存器的事实。看来没有人真正知道这是不是公共信息?确实,当大多数人说“注册”时,他们实际上是指通用注册吗?

–rubberband876
18-10-22在23:01



首先,了解硬件内部的内容真的很困难(例如,请参阅BlackHat 2018上的英特尔God-mode演讲),因此总是有可能每个人都不知道未知功能(它可能是寄存器或指令)。而且,不,它们也不都是GPR,大多数寄存器都链接到指令集。唯一的GPR是Rxx寄存器(RAX,RBX,RCX,RDX,R8,... R15,所以总共12个寄存器)。

–恐怖
18-10-23在7:41

@ rubberband876我们只需要知道架构暴露的寄存器。内部的其他内容只是不必要的实现细节。例如,通过寄存器重命名,实际上有更多的寄存器映射到正在运行的程序的寄存器。还有许多内部硬件寄存器可临时存储数据,例如管道中的每个阶段之间。在我们无法知道的每个实现之间,这些都会改变

–phuclv
18-10-23在9:24

#2 楼

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

您链接的答案涵盖了下图中的所有常用寄存器(从此处获取):



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



上图中没有显示新的扩展控制寄存器系列寄存器,目前仅为其定义了XCR0

系统寄存器是特定于模型的寄存器的一部分,顾名思义,它们是特定于模型的。 CPU之间的变化也有所不同。有关AMD64体系结构的完整列表,请参见《 AMD64体系结构手册》的“附录A MSR交叉引用”。


某些扩展支持某些基于AMD64的CPU支持/实现。可用的XMM寄存器集。 XMM(以及后来的YMMZMM)目前已扩展到AVX-512中最多32个512位的寄存器。与通用寄存器类似,XMM寄存器允许访问YMMZMM对应寄存器的下部。

另外还有所谓的“内存映射寄存器”,这基本上意味着这些寄存器是通过存储器操作而不是指定的指令访问的。根据您的定义,它们可以被抵消为寄存器。这样的示例之一就是AMD64第16.3.2节中描述的“ APIC寄存器”。甚至有些内部寄存器没有通过指令集公开,而是出于性能原因使用。