首页 > 解决方案 > 在指令顺序中,是否会在没有分支指令的情况下执行标记指令?

问题描述

beq $s0, $s1, Lab1 add $s2, $s0, $s1 Lab1: sub $s1, $s1, $s0 当 $s0, $s1 不等于 line2 时将被执行。line3 会在 line2 之后执行吗?或者仅当满足 if 语句并发送到 Lab1 时可以执行 line3 吗?

我希望我把我的问题说清楚了。提前致谢。

标签: if-statementmipsbranch

解决方案


每条指令都告诉处理器接下来是什么指令。

让我们仔细看看add指令。

它计算总和,将其放入目标寄存器,并且并行地将程序计数器递增 4——明确地告诉处理器下一条指令是地址顺序中的下一条指令。


一条nop指令通常被认为什么都不做——它甚至代表无操作——但它确实增加了 pc,所以从技术上讲它根本什么都不做。


作为汇编语言学生的导师,我发现强调程序计数器很有用。

有经验的汇编语言程序员经常忽略程序计数器,因为它对处理器的运行至关重要。所以,让我们谈谈它。

每条指令都告诉处理器接下来是什么指令:每条指令都会更新程序计数器,并且,对程序计数器的更新是每条指令告诉处理器下一步是什么的机制。每条指令都有自己的内存地址;因为程序计数器保存了它的地址,所以执行了给定的指令。顺序操作并不神奇——每条指令都必须告诉处理器下一步是什么(即必须更新电脑)。

程序还可以与程序计数器交互,调用 ( jal) 将程序计数器捕获到$ra寄存器中,以便子例程或函数用于将处理器的控制权返回给调用者。

只是稍微过度简化,在子程序或函数中,向后移动程序计数器形成一个循环——处理器向后重新执行它之前已经做过的事情;根据 if-then 或 if-then-else 的需要,向前移动它会跳过某些内容。

但是每条指令都有明确定义的方式来修改程序计数器,无论它看起来是显式的还是隐式的。


          Assembly              Machine Code Operation
    beq $s0, $s1, Lab1    # skip 1 instruction on condition $s0 == $s1
    add $s2, $s0, $s1     # not skipped if $s0 != $s1: next is pc+4
Lab1:                     # no machine code for this
    sub $s1, $s1, $s0     # run after beq when $s0 == $s1 -or else- after add

在汇编语言中,标签通知汇编器如何翻译使用它的指令。  Lab1将与一个位置、一个地址相关联,这里是sub指令的地址。

beq是一个有条件的 pc 相对分支。因此,它想要的值是 pc-next (自身的)和分支目标之间的 delta,here Lab1。delta 为 0 将导致不跳过任何指令,而 delta 为 1 将导致跳过 1 条指令。在这里,我们要跳过 1 条指令,因此 delta 将为 1。机器代码中的字面意思是 1 beq

执行后beq,处理器将被告知(基于指定的 eq 条件)它是否会分支。它通过将 pc 调整为 pc+4 - 或 - 调整为 pc+4+delta 来做到这一点。

其他两个指令都是我们所说的顺序指令,因此它们通知处理器 pc-next 是 pc+4。知道您可以在采用或未采用的条件分支上遵循完整的顺序。


推荐阅读