MIPS 汇编 Return 在分支语句中调用

MIPS Assembly Return to Call in a branch statement

我有:

CODE

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


MORE CODE

option1:
    code
    jr $ra????

option2:
    code
    jr $ra

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

如果我在每条语句中都使用 jr $ra 来执行此操作,则会出现无限循环。 如果我在没有这些的情况下这样做,它 运行 两个语句都会跳过我输入的代码块的其余部分并继续下一个函数..

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

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

标准分支指令(如 beq)不保存程序计数器,因此当您意外调用 jr 时 CPU 不知道 return 代码的哪一部分。这就是当您调用 jr.

时您的代码进入循环的原因

或者,您也可以避免 linked 一起跳:

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

我认为你真正需要的是常规跳转指令,它跳转到原始 switch-case 之后的指令:

    CODE

    beq $s3, 1, option1
    beq $s3, 0, option2
return_here:
    MORE CODE

option1:
    code
    j return_here

option2:
    code
    j return_here

这将跳转到 option1option2,完成后它将跳转到 return_here 标签。来自子例程的 jr $ra 指令 returns 这意味着必须使用 jal 指令调用代码(将当前指令指针存储到 $ra 并跳转到地址)。