2014-01-26 67 views
2

我試圖在MIPS中找到最小值和數組的總和。我似乎無法弄清楚我在做什麼錯誤,它會給出錯誤的總和,甚至不會分析並返回數組的最小值。使用MIPS尋找數組中的最小值

我只允許使用兩條分支指令,bnebeq,但任何其他指令都是公平遊戲。

# local variable register 
# int sum  $s0 
# int min  $s1 (To be used when students enhance the program.) 
# int *p  $s2 
# int *past_last $s3 
# 
    .text 
    .globl main 
main: 
    la $s2, arr  # p = arr 
    addi $s3, $s2, 24  # past_last = p + 6 
    lw $s0, ($s2)  # sum = *p 
while: 
    addi $s2, $s2, 4  # p++ 
    beq $s2, $s3, endwhile # if (p == past_last) goto L2 
    lw $t0, ($s2)  # $t0 = *p 
    lw $t1, -4($s2)  # $t1 = *(p--) 
    slt $t2, $t1, $t0  # $t2 = 1 if (*p < *(p--)) else $t2 = 0 
    bne $t2, $zero, minimum # if ($t2 != 0) goto minimum 
    add $s0, $s0, $t0  # sum += $t0 
    j while 
minimum: 
    lw $s1, ($t1)  # min = $t1 
    j while 
endwhile:  

回答

2

這不是你如何移動一個寄存器到另一個:

lw $s1, ($t1)  # min = $t1 

該指令將讀取包含在$t1地址一個單詞,把它放在$s1。到寄存器移動到另一個正確的方法是:

move $s1, $t1 

或者,如果你不想使用僞指令:

or $s1, $zero, $t1 

你計算最小的方法是因爲您只考慮位置N處的元素是否小於位置N-1處的元素。你應該做的是在循環之前初始化min($s1)到數組中的第一個元素(就像你對sum進行操作一樣),然後將每個迭代的循環與當前元素進行比較。


add, $s0, $s0, $t0該指令不應的bne $t2, $zero, $minimum指令之前被放置。否則,當採用分支時,當前元素將不會被添加到總和中(除非您的仿真器/仿真器模擬分支延遲槽,並且彙編器不會自動爲您填充延遲槽)。

+0

非常感謝! – user2880990