2009-04-08 78 views
0

我正在爲我的計算機組織類工作一些MIPS代碼,以及我似乎無法讓MIPS正常工作,並且沒有多少MIPS資源在線。我在PCSPIM上運行代碼。代碼應該爲array2的內容添加10並將它們存儲在array1中,然後再打印數組1.現在重新編寫代碼。MIPS代碼壞

.text 
main: 
    la $t0, array1 
    la $t1, array2 
    la $s0, valuec 
    li $s2, 6 
    add $t6, $zero, 1 #i = 1 

Loop: 
    addi $t6, $t6, 1 #i++ 

    lw $t2, ($t0) 
    lw $t5, ($t1) 
    lw $s1, ($s0) 
    addu $t2, $t5, $s1 
    sw $t2, ($t0) 
    add $t0, $t0, 4 
    add $t1, $t1, 4 
    li $v0, 1 
    move $a0, $t2 
    syscall 
    blt $t6, $s2, Loop 

    li $v0, 10 
    syscall 
.data 
    array1: .space 20 
    array2: .word 1,2,3,5,9 
    valuec: .word 10 

PCSPIM打印0 5倍,並返回例外7中的錯誤數據地址]發生,而忽視

回答

2

這是家庭作業,所以我只會給你現在的線索,並隨時添加。幾件事:

1 /你需要告訴我們它是什麼假設要做。這是最重要的事情。

2您可以將array1地址存儲到t0中,然後在第一個循環中重新使用t0。

3 /您似乎對地址和這些地址的內容("la $s0, valuec""addu $t0, $t1, $s0")感到困惑。

UPDATE:

其實我有簽過了一段時間,所以我會後我的解決方案,從而不會讓你陷入困境。

我之前提到的困惑是,您將兩個地址加載到$ t1和$ s0中,然後將它們加在一起得到另一個地址 - 這可能遠遠超出您的數據區域(您應該真的是增加一個地址和一個偏移量)。

這基本上是你的代碼問題(包括打印的零和崩潰)。你最好的選擇就是解決這個問題,並參考下面的代碼,作爲最後的手段,看看我會如何做到這一點。複製代碼從長遠來看不會對你有所幫助,你應該明智地假設你的教育工作者也在檢查所有網站的抄襲行爲。

這是我想出的代碼(很快,所以你需要測試它 - 它可能有錯誤)。我建議你閱讀很好的的意見,瞭解它在做什麼。

我會在幾個小時後回來看看你在做什麼。乾杯。

.text 
main: 

# Initialization of array pointers and loop 

    la  $t0, array1  # address of array 1 
    la  $t1, array2  # address of array 2 
    li  $t2, 1   # element number 
    li  $t3, 6   # upper limit of elements 

# Process each word in array 2, adding 10 and placing 
# into array 1. 

Loop: 
    lw  $t3, 0($t1)  # get word from array 2 
    addi $t3, $t3, 10  # add 10 to word 
    sw  $t3, 0($t0)  # store word into array 1 
    addi $t0, $t0, 4  # move to next entry in array 1 and 2 
    addi $t1, $t1, 4 
    addi $t2, $t2, 1  # increment element number 
    blt  $t2, $t3, Loop # loop until all elements done 

# Initialize printing loop by going back to start of array 1 

    la  $t0, array1  # address of array 1 
    li  $t2, 1   # element number 

# Loop through array 1, printing each element. 

pLoop: 
    lw  $t2, 0($t0)  # get word from array 1 
    li  $v0, 1   # 'print' command code 
    move $a0, $t2   # needs value in $a0 
    syscall     # print it 
    addi $t0, $t0, 4  # move to next entry in array 1 
    addi $t2, $t2, 1  # increment element number 
    blt  $t2, $t3, Loop # loop until all elements done 

    li  $v0, 10   # 'terminate' command code 
    syscall     # exit 

# Data arrays for array 1 and 2 

.data 
array1: .word 0,0,0,0,0 
array2: .word 1,2,3,4,5 
-1

有一些可能出現的問題,但最明顯的/有可能的是,你是不是從main返回在數據部分開始之前。

jr ra 
+0

我認爲這是由命令代碼$ v0設置爲10的最終系統調用處理的。 – paxdiablo 2009-04-08 03:34:47