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

时间:2016-11-12 05:13:07

标签: assembly mips

我有:

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,我会得到一个无限循环。 如果我没有这些,它会运行两个语句然后跳过其余的代码块并继续下一个函数..

如何制作一个分支语句,在完成后将其带回来?

2 个答案:

答案 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

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