簡體   English   中英

MIPS程序集在分支語句中返回呼叫

[英]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

這將跳至option1option2 ,完成后將跳至return_here標簽。 jr $ra指令從子例程返回,這意味着必須使用jal指令來調用代碼(將當前指令指針存儲到$ra並跳轉到地址)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM