0
C代碼是這樣的如何在MIPS添加一個常數數組項
function foo()
{
int i,a[10],b[10],c=2;
for (i=0; i<10; i++) a[i] = b[i] + c;
printf (「%d\n」, i);
}
這裏是我的MIPS代碼:
.data
a: .space 10
n: .word 1
m: .word 10
.text
main:
la $t1, a
la $t2, a
la $s3, n
lw $t5, 0($t1)
lw $t6, 0($t2)
lw $t3, 0($s3)
lw $t4, 4($s3)
add $t0, $0, $0
foo:
beq $t0, $t4, done
add $t0, $t0, $t3
add $s5, $t3, $t3
lw $s1, 0($t5)
lw $s2, 0($t6)
add $s1, $s1, $s5
sw $s1, 0($t5)
addi $t5, $t5, 4
addi $t6, $t6, 4
j foo
done:
li $v0,1
move $a0,$t0
syscall
jr $ra
當我qtspim運行它,會出現此錯誤信息:
Exception occurred at PC=0x00400030
Bad address in data/stack read: 0x00000000
Attempt to execute non-instruction at 0x80000180
您應該使用qtspim單步執行代碼並查看出錯的位置。此外,你應該評論你的代碼,特別是如果你想讓別人幫忙。告訴我們'PC = 0x00400030'處的指令也是有意義的。 – Jester
你最初在'a'得到的是10個字節,其值爲零。在'lw $ t5,0($ t1)'中,你將一個零字從'a'加載到寄存器'$ t5'中。然後,您嘗試從'lw $ s1,0($ t5)'的地址零處讀取,這將導致異常。你真的需要考慮你分配給每個寄存器的值和地址,以及你如何在你的程序中使用它們。 – Michael
@邁克爾\t現在,我通過你的建議,但是錯誤編寫新的代碼出現在西南的部分.... \t LW $ T5,0($ T1) \t LW $ T6,O($ T2) \t加$ T5,$ $ s5 \t sw $ s1,0($ t5)存儲中的未對齊地址:0x00000002 嘗試在0x80000180處執行非指令 – myeongsookim