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。它们可以与 beq 和 bne 以及 $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 和扩展的立即值都被视为无符号整数。符号扩展允许立即值表示非常大和非常小的无符号整数。