【问题标题】:MIPS Assembly Return to Call in a branch statementMIPS 程序集返回调用分支语句
【发布时间】:2023-04-06 22:48:02
【问题描述】:

我有:

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

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

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    要使用跳转返回 (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
    

    【讨论】:

    • 这不会进入无限循环吗?因为最后它总是跳回来
    【解决方案2】:

    我认为您在这里真正需要的是常规跳转指令,它在原始 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 并跳转到地址)。

    【讨论】:

    • 现在由于某种原因,它每次打印相同的语句两次
    • Aaand 现在我回到了无限循环问题:(
    • @ConnorSchwinghammer :好吧,那么问题出在其他地方。当您打印一些字符串时,我假设您正在调用某个函数。您是否正确跳转到例程 (jal) 并在此之前存储 $ra 的原始值和所有相关寄存器。在此例程结束时只需 jr $ra 返回?详细了解 MIPS ABI。
    • 我不小心让它跳到了一个变量名。修复了这个问题并停止了循环,但现在无论 s3 的值如何,它都会同时运行 option1 和 option2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2011-12-16
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多