MIPS 汇编 Return 在分支语句中调用
MIPS Assembly Return to Call in a branch statement
我有:
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 来执行此操作,则会出现无限循环。
如果我在没有这些的情况下这样做,它 运行 两个语句都会跳过我输入的代码块的其余部分并继续下一个函数..
我怎样才能做一个分支语句,当它完成时让我回到它?
要使用jump-return (jr) 指令,您必须先使用jump-and-link 指令(jal) 进行跳转。该指令在跳转到代码的另一部分之前保存位于 $ra 寄存器中的程序计数器。这样,CPU 就知道调用 jr 时 return 代码的哪一部分。
标准分支指令(如 beq)不保存程序计数器,因此当您意外调用 jr 时 CPU 不知道 return 代码的哪一部分。这就是当您调用 jr.
时您的代码进入循环的原因
或者,您也可以避免 linked 一起跳:
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
我认为你真正需要的是常规跳转指令,它跳转到原始 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
指令 returns 这意味着必须使用 jal
指令调用代码(将当前指令指针存储到 $ra
并跳转到地址)。
我有:
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 来执行此操作,则会出现无限循环。 如果我在没有这些的情况下这样做,它 运行 两个语句都会跳过我输入的代码块的其余部分并继续下一个函数..
我怎样才能做一个分支语句,当它完成时让我回到它?
要使用jump-return (jr) 指令,您必须先使用jump-and-link 指令(jal) 进行跳转。该指令在跳转到代码的另一部分之前保存位于 $ra 寄存器中的程序计数器。这样,CPU 就知道调用 jr 时 return 代码的哪一部分。
标准分支指令(如 beq)不保存程序计数器,因此当您意外调用 jr 时 CPU 不知道 return 代码的哪一部分。这就是当您调用 jr.
时您的代码进入循环的原因或者,您也可以避免 linked 一起跳:
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
我认为你真正需要的是常规跳转指令,它跳转到原始 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
指令 returns 这意味着必须使用 jal
指令调用代码(将当前指令指针存储到 $ra
并跳转到地址)。