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

Arrays 使用MIPS查找数组中的最小值,arrays,sum,mips,minimum,Arrays,Sum,Mips,Minimum,我试图在MIPS中找到数组的最小值和和。我似乎不知道我做错了什么,因为它给出了错误的和,它甚至没有分析并返回数组的最小值 我只允许使用两个分支指令,bne和beq,但任何其他指令都是公平的 # local variable register # int sum $s0 # int min $s1 (To be used when students enhance the program.) # int *p $s2 # int *past_las

我试图在
MIPS
中找到数组的最小值和和。我似乎不知道我做错了什么,因为它给出了错误的和,它甚至没有分析并返回数组的最小值

我只允许使用两个分支指令,
bne
beq
,但任何其他指令都是公平的

# 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:       
#局部变量寄存器
#整笔金额$s0
#int min$s1(学生加强课程时使用)
#整数*p$s2
#int*过去的最后一个$s3
#   
.文本
格洛博梅因酒店
主要内容:
la$s2,arr#p=arr
addi$s3,$s2,24#过去#最后一次=p+6
lw$s0,($s2)#总和=*p
而:
附加$s2,$s2,4#p++
beq$s2,$s3,endwhile#if(p==pass_last)转到L2
lw$t0,($s2)#$t0=*p
lw$t1,-4$s2#$t1=*(p--)
slt$t2,$t1,$t0#$t2=1如果(*p<*(p--)否则$t2=0
bne$t2,$0,最小值#如果($t2!=0)转到最小值
加上$s0、$s0、$t0#总和+=$t0
j同时
最低要求:
lw$s1,($t1)#min=$t1
j同时
结束时:

这不是将一个寄存器移动到另一个寄存器的方式:

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
指令之前。否则,在执行分支时,当前元素不会添加到总和中(除非模拟器/仿真器模拟分支延迟槽,并且汇编器不会自动为您填充延迟槽)