跳转到内容

MIPS 汇编/控制流指令

来自维基教科书,开放的书籍,为一个开放的世界

跳转指令

[编辑 | 编辑源代码]

跳转指令将一个新值加载到 PC 寄存器中,该寄存器存储正在执行的指令的值。这会导致从内存中读取的下一条指令从一个新位置检索。

指令
j
类型
J 类型

j 指令将一个立即值加载到 PC 寄存器中。这个立即值要么是一个数字偏移量,要么是一个标签(汇编器会将标签转换为偏移量)。

指令
jr
类型
R 类型

jr 指令将 PC 寄存器加载一个存储在寄存器中的值。因此,jr 指令可以像这样调用

jr $t0

假设目标跳转位置位于 $t0 中。

[编辑 | 编辑源代码]

跳转和链接指令类似于跳转指令,只是它们将下一条指令的地址(跳转后立即执行的指令)存储在返回地址 ($ra; $31) 寄存器中。这允许子程序在完成后返回到主程序主体。

指令
jal
类型
J 类型

j 指令类似,只是返回地址加载到 $ra 寄存器中。

指令
jalr
类型
R 类型

jr 指令相同,只是返回地址加载到指定的寄存器中(如果没有指定则加载到 $ra 中)

假设我们有一个子程序,它以标签 MySub 开始。我们可以使用以下代码行调用子程序

jal MySub
...

我们可以如下定义 MySub 以返回到父程序主体的程序主体

jr $ra

分支指令

[编辑 | 编辑源代码]

与将 rt 用作目标操作数不同,rs 和 rt 都用作源操作数,并且立即值被符号扩展并添加到 PC 中,以计算跳转到指令的地址(如果分支被执行)。

指令
beq
类型
I 类型

如果 rs 和 rt 相等,则分支。如果 rs = rt,则 PC ← PC + 4 + imm。

指令
bne
类型
I 类型

如果 rs 和 rt 不相等,则分支。如果 rs ≠ rt,则 PC ← PC + 4 + imm。

指令
bgez
类型
I 类型

如果 rs 大于或等于零,则分支。如果 rs ≥ 0,则 PC ← PC + 4 + imm。

指令
blez
类型
I 类型

如果 rs 小于或等于零,则分支。如果 rs ≤ 0,则 PC ← PC + 4 + imm。

指令
bgtz
类型
I 类型

如果 rs 大于零,则分支。如果 rs > 0,则 PC ← PC + 4 + imm。

指令
bltz
类型
I 类型

如果 rs 小于零,则分支。如果 rs < 0,则 PC ← PC + 4 + imm。

设置指令

[编辑 | 编辑源代码]

如果这些指令的条件为真,则将 rd 设置为 1。它们可以与 beqbne 以及 $zero 结合使用,根据两个寄存器的比较结果进行分支。

指令
slt
类型
R 类型

如果 rs < rt,则 rd ← 1,否则为 0。

指令
slti
类型
I 类型

如果 rs < imm,则 rd ← 1,否则为 0。立即值被符号扩展。

指令
sltu
类型
R 类型

如果 rs < rt,则 rd ← 1,否则为 0。将 rs 和 rt 视为无符号整数。

指令
sltiu
类型
I 类型

如果 rs < imm,则 rd ← 1,否则为 0。立即值被符号扩展,但 rs 和扩展的立即值都被视为无符号整数。符号扩展允许立即值表示非常大和非常小的无符号整数。

华夏公益教科书