2014-03-30 57 views
1

好的,所以我開始編寫MIPS代碼來乘以兩個數組。我想把我到目前爲止的內容加入到QtSpim中,看看價值是否會隨着我的期望而改變。MIPS:跳轉目標與指令PC的高4位不同0x400014

然而,當我嘗試我的文件加載到QtSpim我收到此錯誤:
Target of jump differs in high-order 4 bits from instruction pc 0x400014

你看我要去哪裏錯了,還是有調試任何好的想法?我不確定問題出在哪裏或哪裏。

謝謝。

編輯這工作:

main: 
    la  $a2, array1 
    la  $a3, array2 
    li $a1, 5 
    li $v0, 1 
    add  $a0, $a1, $0 
    syscall 

    lw $a0, 0($a2) 
    syscall 

    lw $a0, 0($a3) 
    syscall 

    li $v0, 10 
    syscall 
.data 
array1: .word 10, 10, 10, 10, 5 
array2: .word -10, -10, 10, 10, 5 

全碼:

.data 
array1: .word 10, 10, 10, 10, 5 
array2: .word -10, -10, 10, 10, 5 

main: 

li $a2, 5 
addiu $15, $a2, 1 
la $a0, array1 
la $a1, array2 
j MAC 

MAC: 

addiu $sp, $sp, -4 
sw $ra, 4($sp) 
li $v1, 0 
li $s0, 0 

loopInMAC: 

beq $s0, $15, main2 
j mult1 
add $v1, $v1, $v0 
addiu $s0, $s0, 1 
j loopInMAC 

mult1: 

lw $s1, 0($a0) 
lw $s2, 0($a1) 
slt $s3, $s1, 0 
slt $s4, $s2, 0 
addiu $sp, $sp, -4 
sw $ra 0($sp) 
bne $s3, 1, skip1 
sub $s1, $0, $s1 

skip1: 

bne $s4, 1, skip2 
sub $s2, $0, $s2 

skip2: 

li $v0, 0 

loopInMult: 

beq $s1, $0, skip3 
andi $t0, $s1, 1 
beq $t0, $0, skipAdd 
add $v0, $v0, $s2 

skipAdd: 

sll $s2, $s2, 1 
srl $s1, $s1, 1 
j loopInMult 

skip3: 

beq $s1, $s2, equalSign 
sub $v0, $0, $v0 

equalSign: 
jr $ra 

回答

5

不要把代碼中.data部分。 main:之前,您應該啓動.text(代碼)段,即:

.text 
main: 

而且,你有放置main:,目前不會被執行前的幾個指令。我懷疑那些是要放在main:

+0

之後不,我不能把它放在主之前。它需要主要在第一行,除非我創建一個globl。主,這是我的老師昨晚告訴我的。不過他說最簡單的辦法是簡單地將.data放在文件末尾,這樣我就永遠不會在我的代碼 – user3251142

+0

_中出現錯誤 - 「我不能將它放在main之前,它需要main第一行「_嗯,是的,你可以,而且,不,不。 '.text'不會生成任何代碼/數據。它只是告訴彙編程序,您希望將後面的代碼和數據放在'.text'部分。 – Michael

+0

.text表示我在做代碼? – user3251142