我有:
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,我会得到一个无限循环。 如果我在没有这些的情况下执行此操作,它会运行这两个语句,然后跳过其余的代码块并继续执行下一个函数..
我怎样才能做一个分支语句,当它完成后会让我回到它?
最佳答案
要使用跳转返回 (jr) 指令,您必须首先使用跳转和链接指令 (jal) 进行跳转。该指令在跳转到代码的另一部分之前保存位于 $ra 寄存器中的程序计数器。这样,当 jr 被调用时,CPU 就知道要返回代码的哪一部分了。
标准分支指令(如 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
关于assembly - MIPS 程序集返回调用分支语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40559802/