当标记指令处于指令顺序时,是否会在没有分支指令的情况下执行?

is a labeled instruction going to be executed without a branching instruction when it is in an instruction order?

beq $s0, $s1, Lab1 add $s2, $s0, $s1 Lab1: sub $s1, $s1, $s0 当 $s0, $s1 不相等时将执行 line2。 line3 会在 line2 之后执行吗? 还是只满足if语句就可以执行line3并发给Lab1?

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

每条指令都会告诉处理器下一条指令是什么。

让我们仔细看看add指令。

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


通常说 nop 指令什么都不做——它甚至代表无操作——但它确实增加了 pc,所以从技术上讲它根本不做任何事情。


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

有经验的汇编语言程序员经常忽略程序计数器,因为它对处理器的操作来说非常重要。那么,让我们暂时谈谈它。

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

程序也可以与程序计数器交互,调用(jal)将程序计数器下一个捕获到$ra寄存器中,供子程序或函数使用return返回控制处理器的调用者。

只是稍微过于简化了,在一个子程序或函数中,将程序计数器向后移动形成一个循环——处理器向后移动以重新执行它之前已经做过的事情;根据 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(其自身)和分支目标之间的增量,此处为 Lab1。 delta 为 0 将导致没有指令被跳过,delta 为 1 将导致 1 条指令被跳过。这里我们要跳过 1 条指令,因此增量将为 1。beq.

的机器代码中确实有一个 1

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

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