MIPS 程序集返回到分支语句中的调用

3 assembly mips

我有:

CODE

beq $s3, 1, option1
beq $s3, 0, option2


MORE CODE

option1:
    code
    jr $ra????

option2:
    code
    jr $ra
Run Code Online (Sandbox Code Playgroud)

我正在尝试测试 s3 是 0 还是 1 并运行不同的代码块(输出字符串),然后从第二个 beq 之后立即开始继续执行其余代码

如果我在每个语句中使用 jr $ra 来做,我会得到一个无限循环。如果我没有这些,它会运行两个语句,然后跳过其余的代码块并继续执行下一个函数。

我怎样才能做出一个分支语句,让它在完成后让我回到它?

BiN*_*4RY 5

要使用跳转返回 (jr) 指令,您必须首先使用跳转和链接指令 (jal) 进行跳转。该指令在跳转到代码的另一部分之前保存位于 $ra 寄存器中的程序计数器。这样,CPU 就知道在调用 jr 时要返回代码的哪一部分。

标准分支指令(如 beq)不保存程序计数器,因此当您意外调用 jr 时,CPU 不知道要返回代码的哪一部分。这就是为什么当您调用 jr 时您的代码会进入循环的原因。

或者,您也可以避免链接跳转:

CODE

beq $s3, 1, option1
option1_ret:    

beq $s3, 0, option2
option2_ret: 

MORE CODE

option1:
    code
    j option1_ret

option2:
    code
    j option2_ret
Run Code Online (Sandbox Code Playgroud)