为什么这两个mips指令会导致管道中的数据危害?

时间:2013-04-22 01:51:23

标签: assembly mips pipeline

我正在学习mips的管道,并被告知这两条指令:

jal addr;
store $ra;store the value of $ra into memory

会导致数据危害,但我不明白为什么。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

我不知道store是什么,但MIPS上的所有正常分支和跳转指令都与紧随的指令一起执行。在大多数琐碎的情况下,您可能会认为分支/跳转是执行最后一个和另一个指令,第一个。

但是,如果配对指令在内部执行几乎不可分割的指令而不是两个独立的指令,我不会感到惊讶。

这里潜在的问题是jal$ra中存储了store后面的指令的地址。如果store或其他任何指令使用$ra,则在$ra的两次访问之间可能存在竞争条件,数据危险,无论您称之为什么,最终结果可能不是确定的,也不是天真的期望。

答案 1 :(得分:0)

MIPS分支延迟槽中的指令始终在执行分支之前完全执行。因此,store $ra指令将存储$ra的值之前 jal指令更新$ra。换句话说,这个序列:

    li  $ra, 0x1234
 L: jal addr
    nop
    store $ra, mem    # mem <- L + 8

会将不同的值存储到内存中,而不是此序列:

    li  $ra, 0x1234
    jal addr
    store $ra, mem    # mem <- 0x1234

这不是MIPS架构中未定义的序列,因此结果是可预测的。

MIPS汇编程序通常会在nop之后插入jal,除非设置noreorder