[英]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進行操作,則會出現無限循環。 如果我不這樣做,它將運行兩個語句,然后跳過其余的代碼塊,並繼續執行下一個功能。
我該如何做一個分支語句,使它在完成后重新回到它上面?
要使用跳轉返回(jr)指令,必須首先使用跳轉和鏈接指令(jal)進行跳轉。 該指令在跳轉到代碼的另一部分之前將程序計數器保存在$ ra寄存器中。 這樣,CPU知道在調用jr時要返回到代碼的哪一部分。
標准分支指令(如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
我認為您實際需要的是常規跳轉指令,該指令會在原始切換條件后跳轉到指令:
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
指令從子例程返回,這意味着必須使用jal
指令來調用代碼(將當前指令指針存儲到$ra
並跳轉到地址)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.