2016-01-12 32 views
0

所以我的jal操作員看起來並不像做它應該做的事情。它看起來就是節省了4個地址,而不是它想要的。我的測試代碼是:爲什麼我的JAL從PC獲得+4以上的應該?

.data 

test: .asciiz "test" 
test1: .asciiz "test1" 
test2: .asciiz "test2" 
.text 
main: 
la $a0, test 
li $v0, 4 
syscall 
li $t9, 5 # messing with line before jal 
jal next 
li $v0, 10 
syscall 
# it should never hit this code 
la $a0, test1 
li $v0, 4 
syscall 
next: 
la $a0, test2 
li $v0, 4 
syscall 
jr $ra 
li $a0, 1 # it should never hit this code 
li $v0, 1 
syscall 

輸出結果爲:「執行:執行因錯誤而終止」。代碼並不重要,它只是假設用jal顯示問題,有誰知道如何修復pc或jal? (我已經重新安裝了mars和java。)
printscreenofjal

回答

1

這聽起來像你在火星的設置中啓用了延遲分支。

如果採取MIPS32™架構來看看JAL說明對於程序員 第二卷:將MIPS32™指令集你會看到什麼你所描述的實際上是正確的和預期的行爲:

放置在GPR 31的返回鏈路返回地址鏈接的第二指令的分支, 在哪個過程調用後的位置繼續執行之後的地址。

這是因爲MIPS處理器使用延遲分支,這會導致在執行繼續執行分支目標之前緊接着執行分支指令的指令。作爲程序員,這意味着您必須注意填寫分支延遲插槽,可以通過在所有分支指令之後插入NOP或重新組織代碼來完成。

注意,延遲轉移默認情況下禁用,如果我在火星延遲轉移禁用我得到以下輸出運行程序:

testtest2 
-- program is finished running -- 
+0

謝謝你,這個工作。直到你提到它,我才知道這是一種選擇。我也認爲重新安裝它會重置默認值。儘管現在工作。 – Joseph

相關問題