assembly - MIPS 中分支指令的 NOPS 数

标签 assembly process mips cpu-architecture

我们最近在电路课上讨论单周期和流水线处理器时讨论了 NOP。如果我们有以下代码:

add $t1, $t2, $t3
sub $t4, $t1, $t0

由于$t1,存在数据危险。在没有数据危险检测单元的流水线处理器中,在$t1的更新值被写回寄存器之前,子指令使用旧值——因此存在数据危险。如果我们添加 2 个 NOPS,那么我们就可以解决这个问题,或者,如果有数据危险检测单元,我们可以在执行阶段之后将结果转发给 $t1

但是如果我们有分支指令怎么办?例如:

add $t1, $t2, $t3
beq $t0, $t1, Label

如果我们不能使用转发,我们是否还要在此处添加 2 个 NOPS?

最佳答案

在没有分支预测的标准流水线 MIPS 处理器中,beq 的相等性测试是在 ALU 中执行的,即在 EX 阶段 — 这意味着它受到相同的 ALU 的约束 -> ALU 危险和相同的旁路可以减轻这种危险。

(这并没有说明分支指令之后可能发生的管道重新填充停顿,来自已采取或错误预测的分支,而只是说明了您所显示的数据依赖性的延迟。)

如果理论上的处理器是流水线式的,但没有危险保护(旁路或延迟),则需要与第一个场景相同的 2 个 nop。

关于assembly - MIPS 中分支指令的 NOPS 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60366393/

相关文章:

C# (MSIL) 到 native X86 代码?

c++ - 如何从 GCC 中的 C/C++ 源代码获取汇编程序输出?

c++ - 为什么我的 WinCE 应用程序中没有 std::bad_alloc?

assembly - 16 位程序集与 64 位 Windows 7 不兼容

iphone - UI优先还是逻辑优先?

c - 读入用 C 打开的 MIPS 文件

java - 在 Java 中等待进程结束

linux - 有没有办法使用 monit 列出进程参数

MIPS - JAL 混淆 : $ra = PC+4 or PC+8?

mips - 从多个 mips 中获取结果