[英]Strange jump in MIPS assembly
我可能在這里遺漏了一些非常明顯的東西,但是我一直在重復這個問題而且我堅決地陷入困境。 在下面的代碼中, $8
僅在$2 != $0
遞增。 現在我進行了雙重和三重檢查,並且beq
指令正常工作(例如,如果我將lop更改為end2,它確實會去那里)。
但是,由於某種原因,即使執行分支,也會增加$8
。
lop: beq $3, $0, end2
and $2, $3, $4
sll $3, $3, 1
beq $2, $0, lop
addi $8, $8, 1
j lop
我必須承認我完全難過了。
(第一個beq
之后and
之后也會一直執行。)
MIPS具有明確的管道危害; 當決定分支(或不分支)時,以下指令已經通過指令管道進展得足夠遠,無論如何都將執行。 這被稱為“分支延遲槽”。
在某些情況下,您可以安排代碼來利用這一點; 如果你不能(或不想),你可以在下面的指令中放一個nop
。
一些匯編程序會為你重新排序代碼(或填寫nop
) - 例如gas
,GNU匯編程序,除非你告訴它不使用.set noreorder
指令。 但是無論如何你仍然需要在拆卸時注意它。
如果您在沒有自動重新排序的情況下編寫代碼,我建議使用一些額外的縮進來注釋延遲槽以使其突出:
lop: beq $3, $0, end2
nop
and $2, $3, $4
sll $3, $3, 1
beq $2, $0, lop
nop
addi $8, $8, 1
j lop
add指令發生在beq
的分支延遲槽中 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.