簡體   English   中英

MIPS組裝奇怪的跳躍

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

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