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