assembly - 为什么MIPS在计算分支目标地址时使用 'PC+4'作为基地址?

标签 assembly mips cpu-architecture machine-code

如果观察MIPS 5级流水线(1.指令获取 - 2.指令解码 - 3.执行 - 4.内存访问 - 5.WriteBack),是否分支最终在执行阶段确定。 MIPS 5-stage pipeline

您可以在图中看到 ALU 的上部输出被馈送到 MUX 中以在正常 PC 步骤和分支之间进行选择。

因此,当CPU决定是否分支时,从相应指令的IF阶段已经经过了两个流水线阶段。假设当 IF 时 PC1 = PC,当决定分支时 PC2 = PC。因此PC2 = PC1+4。为了将PC2恢复为PC1+4,需要额外的硬件。 (用于操作PC2-4)

尽管有这个缺点,我想知道为什么MIPS处理器使用PC+4作为基地址,而不是直接使用PC+8

最佳答案

如果你需要更多的硬件来获得 PC+8,或者如果你认为你可以跳过管道阶段并将分支偏移应用于取阶段地址。 (MIPS 分支延迟槽意味着从异常返回需要一个 PC 和单独的下一个 PC,以防来自已采取分支的分支延迟槽出现故障。)

如果 fetch 停止并且不推进 PC 怎么办?

在实际的经典 MIPS 中,branch latency is 1 cycle因此,分支与分支延迟槽中的指令相关,而不是 2 个指令之后的指令相关,这是有道理的; How to Calculate Jump Target Address and Branch Target Address? .

此外,IF 阶段已经计算了 PC+4,因此它可以将该值与指令一起沿着管道发送。如果可以避免的话,你不需要长电线;通过管道阶段之间的锁存器发送 PC+4 值是有意义的。

关于assembly - 为什么MIPS在计算分支目标地址时使用 'PC+4'作为基地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61761068/

相关文章:

c++ - C/C++ 中的高级指针类型转换

gcc - C/C++ 到 MIPS 汇编

themes - Mars 4.5 Mips 的黑暗主题?

c - 如何在C代码中区分armhf(ARMv7)和armel(ARMv4)?

linux - 尝试从 64 位 linux 为 32 位 linux 编译 GTK 应用程序

gcc - 编译器总是生成汇编代码吗?

linux - ARM Linux下的特权模式

assembly - ARM assembly 中的分支

assembly - MIPS 打印浮点系统调用仅打印零

c++ - 以最便宜/最少侵入的方式自动更新一点?