我正在学习mips中的管道,并被告知这两条指令:
jal addr;
store $ra;store the value of $ra into memory会造成数据风险,但我不明白why.Could有没有人帮我?
发布于 2013-04-22 10:13:34
我不知道store是什么,但是在MIPS上所有普通的分支和跳转指令都是和紧随其后的指令一起执行的。在大多数微不足道的情况下,你可能认为分支/跳转是最后一个执行的,而另一个指令是第一个执行的。
然而,如果成对的指令在内部作为一个不可分的指令而不是两个单独的指令执行,我不会感到惊讶。
这里的潜在问题是jal在$ra中存储store之后的指令的地址。如果store或它是什么指令使用$ra,在两次访问$ra之间可能会有竞争条件,数据风险,不管你怎么叫它,最终结果可能是不确定的,或者人们可能天真地期望的结果。
发布于 2013-04-23 04:37:30
MIPS分支延迟槽中的指令始终在分支执行之前完全执行。因此,store $ra指令将存储$ra的值,该值是在 jal指令更新$ra之前存在的$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体系结构中不是未定义的序列,因此结果是可预测的。
除非设置了noreorder,否则MIPS汇编程序通常会在jal之后插入一个nop。
https://stackoverflow.com/questions/16138287
复制相似问题