使用MIPS查找数组中的最小值

时间:2014-01-26 07:13:10

标签: arrays sum mips minimum

我正试图找到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:       

1 个答案:

答案 0 :(得分: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指令。否则,当采用分支时,当前元素将不会被添加到总和中(除非您的模拟器/仿真器模拟分支延迟槽并且您的汇编器不会自动为您填充延迟槽)。