我正在学习mips的管道,并被告知这两条指令:
jal addr;
store $ra;store the value of $ra into memory
会导致数据危害,但我不明白为什么。有人可以帮助我吗?
答案 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
。