2016-10-13 59 views
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 
+0

您應該使用qtspim單步執行代碼並查看出錯的位置。此外,你應該評論你的代碼,特別是如果你想讓別人幫忙。告訴我們'PC = 0x00400030'處的指令也是有意義的。 – Jester

+0

你最初在'a'得到的是10個字節,其值爲零。在'lw $ t5,0($ t1)'中,你將一個零字從'a'加載到寄存器'$ t5'中。然後,您嘗試從'lw $ s1,0($ t5)'的地址零處讀取,這將導致異常。你真的需要考慮你分配給每個寄存器的值和地址,以及你如何在你的程序中使用它們。 – Michael

+0

@邁克爾\t現在,我通過你的建議,但是錯誤編寫新的代碼出現在西南的部分.... \t LW $ T5,0($ T1) \t LW $ T6,O($ T2) \t加$ T5,$ $ s5 \t sw $ s1,0($ t5)存儲中的未對齊地址:0x00000002 嘗試在0x80000180處執行非指令 – myeongsookim

回答

0

lwsw必須使用是4的倍數即是「Unaligne的源地址d地址「錯誤。但是,地址爲「2」而不是在0x10010000的範圍內這一事實表明你仍然將你的「指針」與你的「變量」混淆。試試這個:僅對「數據值」使用寄存器$ t0 - $ t4,並將內存地址使用寄存器$ t5- $ t8。這可以幫助您避免混淆。另外,我發現使用MARS比SPIM更容易調試和調試彙編代碼。 (http://courses.missouristate.edu/KenVollmar/mars/

相關問題