x86寄存器:MBR/MDR和指令寄存器

x86寄存器:MBR/MDR和指令寄存器,x86,cpu,cpu-architecture,cpu-registers,X86,Cpu,Cpu Architecture,Cpu Registers,据我所知,IA-32体系结构有十个32位和六个16位寄存器 32位寄存器如下所示: 数据寄存器-EAX、EBX、ECX、EDX 指针寄存器-EIP、ESP、EBP 索引寄存器-ESI、EDI 控制寄存器-EFLAG(EIP也被分类为控制寄存器) 16位寄存器如下所示: 代码段:它包含所有要执行的指令 数据段:包含数据、常量和工作区 堆栈段:它包含程序或子例程的数据和返回地址 额外段(ES)。指向额外数据的指针 F段(FS)。指向更多额外数据的指针 G段(GS)。指向更多额外数据的指针 但

据我所知,IA-32体系结构有十个32位和六个16位寄存器

32位寄存器如下所示:

  • 数据寄存器-EAX、EBX、ECX、EDX
  • 指针寄存器-EIP、ESP、EBP
  • 索引寄存器-ESI、EDI
  • 控制寄存器-EFLAG(EIP也被分类为控制寄存器)
16位寄存器如下所示:

  • 代码段:它包含所有要执行的指令
  • 数据段:包含数据、常量和工作区
  • 堆栈段:它包含程序或子例程的数据和返回地址
  • 额外段(ES)。指向额外数据的指针
  • F段(FS)。指向更多额外数据的指针
  • G段(GS)。指向更多额外数据的指针
但是,我找不到有关当前指令寄存器(CIR)或内存缓冲寄存器(MBR)/内存数据寄存器(MBR)的任何信息。这些寄存器是否被称为其他寄存器?这些寄存器是32位的吗

我假设它们是32位的,并且在这种架构下最常用的指令长度不超过4字节。根据观察,许多指令似乎小于4字节,例如:

  • 推动EBP(55)
  • 电动制动踏板,ESP(8B EC)
  • LEA(8D 44 38 02)
对于较长的指令,CPU将使用前缀代码和其他可选代码。较长的指令需要一个以上的周期才能完成,这取决于指令长度


有问题的寄存器长度为32位,我说的对吗?IA-32体系结构中还有其他寄存器需要注意吗?

没有,您所说的寄存器是一个实现细节,在现代x86 CPU中不作为物理寄存器存在

x86没有指定玩具/教学CPU设计中的任何实现细节。x86手册只指定架构上可见的内容。

英特尔和AMD的优化手册详细介绍了内部实现,与您的建议完全不同。现代x86 CPU将体系结构寄存器重命名为更大的物理寄存器文件,从而实现无序执行,而不会因写后写或读后写数据危险而暂停。(有关注册表重命名的详细信息,请参阅)。有关无序执行的基本介绍,以及实际Haswell内核的框图,请参阅。(记住,一个物理芯片有多个核)


与简单或玩具微体系结构不同,几乎所有高性能CPU都支持未命中和/或未命中命中(多个未命中的缓存未命中,而不是完全阻塞等待第一个完成的内存操作)


您可以构建一个具有单个MBR/MDR的简单x86;如果最初的8086和386微体系结构在内部实现中有类似的东西,我不会感到惊讶

但例如,Haswell或Skylake core可以从L1d缓存/到L1d缓存进行2次加载和1次存储(请参阅)。显然,他们不能只有一个MBR。相反,Haswell有72个加载缓冲区条目和42个存储缓冲区条目,它们都是内存顺序缓冲区的一部分,支持无序执行加载/存储,同时保持只有StoreLoad重新排序发生/对其他内核可见的错觉

从P5奔腾开始,但在此之前,只有32位访问是原子的。所以是的,如果386/486有一个MDR,它可能是32位。但即使是那些早期的CPU,也可能在CPU和RAM之间有缓存

我们知道,即32字节,Skylake-AVX512具有用于ZMM加载/存储的64字节路径。AMD CPU将宽向量运算分为128位块,因此它们的加载/存储缓冲区条目大概只有16字节宽

Intel CPU至少将相邻存储合并到存储缓冲区内的同一缓存线,并且还有10个LFB(行填充缓冲区)用于L1d和L2(或从内核到L3或DRAM)之间的挂起传输


指令解码:x86为可变长度 x86是一个可变长度的指令集;前缀之后,最长指令的长度超过32位。即使对8086人来说也是如此。例如,
addword[bx+disp16],imm16
的长度为6字节。但8088只有一个4字节的预取队列可供解码(与8086的6字节队列相比),因此它必须支持解码指令,而不必从内存中加载全部内容。8088/8086解码的前缀一次1个周期,4字节的操作码+modRM绝对足以识别指令其余部分的长度,因此它可以对其进行解码,然后获取disp16和/或imm16(如果尚未获取)。现代x86可以有更长的指令,特别是SSSE3/SSE4需要许多强制前缀作为操作码的一部分

它也是一个CISC ISA,因此在内部保留实际指令字节不是很有用;您不能像使用简单MIPS那样直接将指令位用作内部控制信号。

在非流水线CPU中,是的,某个地方可能有一个物理EIP寄存器。对于现代CPU,每条指令都有一个与之关联的EIP,但许多指令在CPU内部同时运行。有序流水线CPU可能会将EIP与每个阶段相关联,但无序CPU必须基于每条指令对其进行跟踪。(实际上是每个uop,因为复杂指令解码到多个内部uop。)

现代x86以16或32字节的块获取和解码,每个时钟周期最多解码5或6条指令,并将解码结果放入队列中,以便前端发送到内核的无序部分

另请参阅中的CPU内部链接,特别是David Kanter的文章和Agner Fog的Microach指南


顺便说一句,你是左撇子