assembly - MIPS 程序集返回调用分支语句

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

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

最佳答案

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

相关文章:

visual-studio-2010 - 一次一条语句单步调试汇编语言程序

assembly - 内存对齐检查机制检查的地址是有效地址、线性地址还是物理地址?

我可以通过 add sp 等恢复堆栈吗

c - 汇编如何在没有 ZF 标志访问的情况下将 JNE 转换为 C 代码

android - 如何在 NDK r17+ 中支持具有 MIPS 架构的设备?

c - 交叉编译时PIC/non-PIC代码错误

c - 如何在 GAS 中设置 .global 符号?

assembly - 为什么 MIPS 堆栈基址是 0x7ffffffc 而不是 0x80000000

c - SPIM(MIPS 模拟器)无法解析以下语句 lui $2,%hi($LC0)

c - 将 C 翻译成 MIPS 汇编