我有:
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,我会得到一个无限循环。 如果我没有这些,它会运行两个语句然后跳过其余的代码块并继续下一个函数..
如何制作一个分支语句,在完成后将其带回来?
答案 0 :(得分:3)
要使用jump-return(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
答案 1 :(得分:1)
我认为你在这里真正需要的是常规跳转指令,跳转到原始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
这会跳转到option1
或option2
,完成后会跳转到return_here
标签。 jr $ra
指令从子例程返回,这意味着必须使用jal
指令调用代码(将当前指令指针存储到$ra
并跳转到地址)。