Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MIPS程序集返回到分支语句中的调用_Assembly_Mips - Fatal编程技术网

Assembly MIPS程序集返回到分支语句中的调用

Assembly MIPS程序集返回到分支语句中的调用,assembly,mips,Assembly,Mips,我有: 我试图测试s3是否为0或1,并运行不同的代码块(输出字符串),然后从第二个beq之后立即开始继续其余代码 如果我在每个语句中使用jr$ra,就会得到一个无限循环。 如果我不使用这些语句,它将运行这两条语句,然后跳过im中的其余代码块,继续执行下一个函数 如何生成分支语句,以便在完成后返回到它?要使用跳转返回(jr)指令,必须首先使用跳转和链接指令(jal)进行跳转。在跳转到代码的另一部分之前,此指令保存位于$ra寄存器中的程序计数器。这样,当调用jr时,CPU知道返回到代码的哪个部分 标

我有:

我试图测试s3是否为0或1,并运行不同的代码块(输出字符串),然后从第二个beq之后立即开始继续其余代码

如果我在每个语句中使用jr$ra,就会得到一个无限循环。 如果我不使用这些语句,它将运行这两条语句,然后跳过im中的其余代码块,继续执行下一个函数


如何生成分支语句,以便在完成后返回到它?

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