据我所读,IA-32架构有10个32位和6个16位寄存器.
32位寄存器如下:
16位寄存器如下:
但是,我无法找到当前指令寄存器(CIR)或内存缓冲寄存器(MBR)/Memory数据寄存器(MBR)的任何信息。这些寄存器是否被称为其他东西?这些寄存器是32位吗?
我假设它们是32位的,并且在这个体系结构下最常用的指令是4字节长的。从观察来看,许多指令似乎少于4个字节,例如:
对于较长的指令,CPU将使用前缀代码和其他可选代码。较长的指令将需要超过一个周期来完成,这将取决于指令的长度。
我是正确的,因为所讨论的寄存器是32位的长度?在IA-32架构中是否还有其他我也应该知道的寄存器?
发布于 2018-07-25 15:44:39
不,您正在讨论的寄存器是一个在现代x86 CPU中不作为物理寄存器存在的实现细节。
x86没有指定在玩具/教学CPU设计中找到的任何实现细节。x86手册只指定了体系结构上可见的内容.
英特尔和AMD的优化手册详细介绍了内部实现,这与你所建议的完全不同。现代x86 CPU将架构寄存器重命名为大得多的物理寄存器文件,从而允许无序执行,而不会因为写后写或写后读数据的危险而停止执行。(有关寄存器重命名的详细信息,请参阅Why does mulss take only 3 cycles on Haswell, different from Agner's instruction tables? )。请参阅this answer以获得无序的基本介绍,以及实际哈斯韦尔核心的框图。(请记住,物理芯片有多个核)。
与简单的或玩具的微体系结构不同,几乎所有的高性能CPU都支持在错过和/或命中的情况下丢失(多个未完成的缓存丢失,而不是完全阻塞等待第一个缓存操作完成的内存操作)。
您可以构建一个具有单个MBR /MDR的简单x86;如果原始8086和可能386微体系结构作为内部实现的一部分,我不会感到惊讶。
但是,例如,Haswell或Skylake核心可以完成从/到L1d缓存(参见How can cache be that fast?)的每个周期2次加载和1次存储。显然他们不可能只有一个MBR。相反,Haswell有72个负载缓冲区条目和42个存储缓冲区条目,它们都是内存顺序缓冲区的一部分,它支持加载/存储的无序执行,同时保持只有StoreLoad重新排序发生/对其他内核可见的错觉。
自从P5奔腾,naturally-aligned loads/stores up to 64 bits are guaranteed atomic,但在此之前,只有32位访问是原子的.是的,如果386/486有MDR,它可能是32位。但是即使是早期的CPU也可以在CPU和RAM之间设置缓存。
我们知道,Haswell and later have a 256-bit path between L1d cache and execution units (即32字节)和Skylake- and 512有64字节的路径用于ZMM加载/存储。AMD CPU将宽矢量运算分成128位块,因此它们的加载/存储缓冲区条目大概只有16个字节宽。
英特尔CPU至少将相邻存储合并到存储缓冲区内的同一高速缓存线上,还有10个LFBs (行填充缓冲区)用于L1d和L2之间的待定传输(或L3或DRAM的非核心传输)。
指令解码: x86是可变长度的
x86是一个可变长度的指令集;在前缀之后,最长的指令超过32位.即使对8086来说也是如此。例如,add word [bx+disp16], imm16有6个字节长。但是8088只有一个4字节的预取队列来解码(相对于8086的6字节队列),所以它必须支持解码指令,而不需要从内存中加载整个程序。8088 / 8086解码前缀一次一个周期,4个字节的操作码+ modRM绝对足够识别其余指令的长度,因此它可以解码它,然后如果还没有取出disp16和/或imm16。现代x86可以有更长的指令,特别是SSSE3 / SSE4需要许多强制性前缀作为操作代码的一部分。
它也是一个CISC,所以在内部保持实际的指令字节并不是很有用;您不能像使用简单的MIPS.那样直接使用指令位作为内部控制信号。
在一个非流水线CPU,是的,可能有一个单一的物理EIP寄存器某处.对于现代CPU,每条指令都有一个与其相关联的EIP,但许多指令同时在CPU内运行。内部流水线CPU可能会将EIP与每个阶段相关联,但无序CPU必须在指令的基础上跟踪它。(实际上每个uop,因为复杂的指令解码到超过一个内部uop。)
现代x86以16或32字节的块来获取和解码,每个时钟周期最多解码5或6条指令,并将解码结果放在一个队列中,以便前端发出到核心的无序部分。
还请参阅https://stackoverflow.com/tags/x86/info中的CPU内部链接,特别是David Kanter的编写和Agner Fog的微弓指南。
顺便说一下,您忽略了x86的许多控制/调试寄存器。CR0.4对于386来说是启用保护模式、分页和其他各种功能的关键。您可以在实际模式下使用CPU,只使用GP和段regs和EFLAGS,但是如果包含操作系统需要管理的非通用规则,x86有更多的体系结构寄存器。
https://stackoverflow.com/questions/51522368
复制相似问题