Assembly MIPS程序集返回到分支语句中的调用
我有: 我试图测试s3是否为0或1,并运行不同的代码块(输出字符串),然后从第二个beq之后立即开始继续其余代码 如果我在每个语句中使用jr$ra,就会得到一个无限循环。 如果我不使用这些语句,它将运行这两条语句,然后跳过im中的其余代码块,继续执行下一个函数Assembly MIPS程序集返回到分支语句中的调用,assembly,mips,Assembly,Mips,我有: 我试图测试s3是否为0或1,并运行不同的代码块(输出字符串),然后从第二个beq之后立即开始继续其余代码 如果我在每个语句中使用jr$ra,就会得到一个无限循环。 如果我不使用这些语句,它将运行这两条语句,然后跳过im中的其余代码块,继续执行下一个函数 如何生成分支语句,以便在完成后返回到它?要使用跳转返回(jr)指令,必须首先使用跳转和链接指令(jal)进行跳转。在跳转到代码的另一部分之前,此指令保存位于$ra寄存器中的程序计数器。这样,当调用jr时,CPU知道返回到代码的哪个部分 标
如何生成分支语句,以便在完成后返回到它?要使用跳转返回(jr)指令,必须首先使用跳转和链接指令(jal)进行跳转。在跳转到代码的另一部分之前,此指令保存位于$ra寄存器中的程序计数器。这样,当调用jr时,CPU知道返回到代码的哪个部分 标准分支指令(如beq)不会保存程序计数器,因此当您意外调用jr时,CPU不知道返回到代码的哪个部分。这就是为什么在调用jr时代码会进入循环 或者,您也可以同时避免链接跳跃:
CODE
beq $s3, 1, option1
beq $s3, 0, option2
MORE CODE
option1:
code
jr $ra????
option2:
code
jr $ra
我认为您在这里实际需要的是常规跳转指令,它在原始切换情况下跳转到指令:
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
这将跳转到
option1
或option2
,完成后将跳转到return\u此处
标签。jr$ra
指令从子例程返回,这意味着必须使用jal
指令调用代码(存储指向$ra
的当前指令指针并跳转到地址).现在出于某种原因,它每次打印两次相同的语句aa现在我回到无限循环问题:(@ConnorSchwinghammer:好吧,那么问题就在别处。当你打印一些字符串时,我假设你在调用某个函数。你是否正确地跳转到例程(jal
)在此之前,存储$ra
的原始值和所有相关寄存器。在此例程结束时,只需jr$ra
返回?了解有关MIPS ABI的更多信息。我意外地将其跳转到变量名。修复了该问题并停止了循环,但现在它运行option1和option2,而不考虑s3的值
CODE
beq $s3, 1, option1
beq $s3, 0, option2
return_here:
MORE CODE
option1:
code
j return_here
option2:
code
j return_here