【问题标题】:Program Counter and Instruction Register程序计数器和指令寄存器
【发布时间】:2013-03-22 07:03:22
【问题描述】:

程序计数器保存下一个应该执行的指令的地址,而指令寄存器保存要执行的实际指令。其中一个还不够吗?

每个寄存器的长度是多少?

谢谢。

【问题讨论】:

    标签: cpu-registers cpu-architecture program-counter


    【解决方案1】:

    您将始终需要两者。程序计数器 (PC) 保存要执行的下一条指令的地址,而指令寄存器 (IR) 保存编码指令。在获取指令时,程序计数器增加一个“地址值”(到下一条指令的位置)。然后该指令被适当地解码和执行。

    你需要两者的原因是因为如果你只有一个程序计数器并将它用于两个目的,你会得到以下麻烦的系统:

    [程序执行开始]

    1. PC 包含 0x00000000(假设这是内存中程序的起始地址)
    2. 从内存中取出编码指令并放入 PC。
    3. 指令被解码并执行。
    4. 现在是时候进入下一条指令了,所以我们回到 PC 看看下一条指令的地址是什么。但是,我们遇到了一个问题,因为 PC 之前的地址被删除了,所以我们不知道下一条指令在哪里。

    因此,我们需要另一个寄存器来保存从内存中获取的实际指令。一旦我们获取了那个内存,我们就增加了 PC 以便我们知道从哪里获取下一条指令。

    附:寄存器的宽度取决于架构的字长。例如,对于 32 位处理器,字长为 32 位。因此,CPU 上的寄存器将是 32 位。指令寄存器在维度上没有区别。区别在于行为和解释。指令以各种形式编码,但是,它们仍然占用 32 位寄存器。例如,Altera 的 Nios II 处理器包含 3 种不同的指令类型,每种都以不同的方式编码。见ftp://ftp.altera.com/up/pub/Tutorials/DE2/Computer_Organization/tut_nios2_introduction.pdf第6页

    您也可以通过上面的链接了解更多关于 Nios II 处理器结构的信息。它是一个简单的 IP CPU。当然,英特尔有自己的规范/设计,并且会有所不同。

    【讨论】:

      【解决方案2】:

      正如您所说,Program Counter (PC) 保存下一条要执行的指令的地址,Instruction Register (IR) 存储要执行的实际指令(但不是它的地址)。

      与这些寄存器的长度有关,目前的机器有 64 位 PC。 IR 的长度(从逻辑的角度来看)取决于架构:

      由于这些机器能够在每个周期获取、解码和执行多条指令,因此 IR 的物理实现并不容易用几行来描述。

      【讨论】:

      • 或者更准确地说,实际上并没有物理的“指令寄存器”,因为现代超标量(尤其是 OOO)CPU 中的代码提取发生在大块中。我想我从未听说过这个术语,甚至在 x86 CPU 内部工作原理的详细描述中也没有提到它。 (Agner Fog's microarch pdf,或英特尔的优化手册,或x86 tag wiki 中的其他链接。除非您实际设计(简单)硬件,否则它可能不是了解 CPU 工作原理的有用术语。
      • 更新:我不久前在x86 registers: MBR/MDR and instruction registers 上写了一个答案,解释了为什么 x86 没有“指令寄存器”——这对于需要的可变指令长度 ISA 没有意义复杂的解码。
      猜你喜欢
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2011-05-04
      相关资源
      最近更新 更多