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