程序计数器和指令寄存器

52

程序计数器存储下一条要执行的指令的地址,而指令寄存器则存储要执行的实际指令。它们两个都必须有吗?

那么这些寄存器的长度是多少?

谢谢。

2个回答

65
你需要同时使用程序计数器(PC)和指令寄存器(IR)。程序计数器保存下一个要执行的指令地址,而指令寄存器则保存编码后的指令。当获取了指令后,程序计数器会增加一个地址值(到下一条指令的位置)。然后对指令进行解码并适当地执行。
需要同时使用这两者的原因是:如果只有程序计数器并用于两个目的,你将得到以下麻烦的系统:
[程序开始执行]
1. PC 包含 0x00000000(假设这是内存中程序的起始地址) 2. 编码后的指令从内存中提取并放入 PC 中。 3. 对指令进行解码和执行。 4. 现在该移动到下一条指令了,所以我们回到 PC 上查看下一条指令的地址。但问题是,PC 的上一个地址已经丢失,因此我们不知道下一条指令在哪里。
因此,我们需要另一个寄存器来保存从内存中提取出的实际指令。一旦获取了该内存,我们就会增加 PC,以便知道从哪里获取下一条指令。
P.S. 寄存器的宽度取决于体系结构的字长。例如,对于32位处理器,字长为32位。因此,CPU 上的寄存器为32位。指令寄存器在尺寸上也没有区别。差异在于行为和解释方式。指令以各种形式进行编码,但它们仍占据32位的寄存器。例如,来自Altera的Nios II处理器包含三种不同的指令类型,每种都以不同的方式进行编码。参见ftp:// ftp.altera.com / up / pub / Tutorials / DE2 / Computer_Organization / tut_nios2_introduction.pdf 第6页。
你还可以从上面的链接了解有关 Nios II 处理器结构的更多信息。它是一个简单的 IP CPU。当然,Intel 有他们自己的规格设计,具体情况会有所不同。

13
正如您所述,程序计数器(PC)保存下一条要执行的指令地址,而指令寄存器(IR)则存储要执行的实际指令(但不包括其地址)。
关于这些寄存器的长度,当前机器的PC为64位。从逻辑角度来看,IR的长度取决于体系结构:
- RISC机器通常具有固定长度的指令。例如,大多数SPARC指令以32位格式编码。 - CISC机器(Intel,AMD)具有可变长度的指令。例如,请参见Intel® 64和IA-32架构软件开发人员手册 由于这些机器能够每个周期获取、解码和执行多条指令,因此IR的物理实现不容易用几行描述清楚。

1
更准确地说,现代超标量(尤其是OOO)CPU中的代码获取是以大块发生的,因此实际上并没有真正的物理“指令寄存器”。我从未听说过这个术语,即使在详细描述x86 CPU内部工作原理的文档中也没有提到它。除非你真的在设计(简单的)硬件,否则它可能不是了解CPU工作原理的有用术语。 - Peter Cordes
1
更新:我之前在 x86寄存器:MBR/MDR和指令寄存器 上写了一个答案,解释了为什么x86没有“指令寄存器”——对于需要复杂解码的可变指令长度ISA来说,这是没有意义的。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接