Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么这两条mips指令会导致管道中的数据危险?_Assembly_Mips_Pipeline - Fatal编程技术网

Assembly 为什么这两条mips指令会导致管道中的数据危险?

Assembly 为什么这两条mips指令会导致管道中的数据危险?,assembly,mips,pipeline,Assembly,Mips,Pipeline,我正在学习mips中的管道,并被告知以下两条说明: jal addr; store $ra;store the value of $ra into memory 会造成数据危险,但我不明白为什么。有人能帮我吗?我不知道什么是存储,但MIPS上所有正常的分支和跳转指令都会与紧接着的指令一起执行。在大多数普通情况下,您可能会认为分支/跳转是在最后一条指令执行的,而其他指令是在第一条指令执行的 但是,如果成对的指令在内部执行时几乎是一条不可分割的指令,而不是两条独立的指令,我也不会感到惊讶 这里潜在

我正在学习mips中的管道,并被告知以下两条说明:

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

会造成数据危险,但我不明白为什么。有人能帮我吗?

我不知道什么是
存储
,但MIPS上所有正常的分支和跳转指令都会与紧接着的指令一起执行。在大多数普通情况下,您可能会认为分支/跳转是在最后一条指令执行的,而其他指令是在第一条指令执行的

但是,如果成对的指令在内部执行时几乎是一条不可分割的指令,而不是两条独立的指令,我也不会感到惊讶


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

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

    li  $ra, 0x1234
 L: jal addr
    nop
    store $ra, mem    # mem <- L + 8
li$ra,0x1234
L:日本航空公司地址
不

存储$ra,mem#mem这不是真正的指令,而是简化的指令。存储意味着将$ra的值存储到内存中。内存位置是什么,因为必须有一个?是的,有一个内存位置,但它在这里似乎不那么重要。我认为只有在“jal”跳转到的子例程完成后,“store”才会读$ra,所以不应该有危险。因此,问题变成了“将获取什么指令?‘存储’或位于‘jal’跳转到的位置的指令?”将获取什么指令不应该有歧义。两条指令中使用的
$ra
值存在歧义。如果用另一条跳转/分支指令替换
存储
(我想它只是
sw
),则指令中可能存在歧义。除此之外,分支/跳转指令的目标地址不会模棱两可,除非执行类似于
jr$v0
的操作,然后紧接着执行
li$v0,1234
So
jal`将
PC+4
存储到
$ra
中,如果此值正是程序员希望通过
store
存储到内存中的值,则不会有任何危险。是这样吗?
    li  $ra, 0x1234
    jal addr
    store $ra, mem    # mem <- 0x1234