我正在尝试在mips中实现for循环:
# {
# int sum = 0;
# for(int x = 0; x < n; x++)
# if ( v[x] > 2 )
# sum += v[x];
# return sum;
# }
我正确地执行了循环,但是我无法正确获得循环的大小。循环可按预期运行,但要多运行一次。它应该打印31,但最终会导致循环额外时间,并从某个地方得到10,然后最终得到41。
这是我的代码:
.eqv SIZE 8
values: .half 6, 5, 1, 9, -2, 3, 8, 2
endl: .asciiz "\n"
endv:
# -------------------------------------------------# text/code section
.text
.globl main
main:
# ------
#TODO: call doSum(values, SIZE)
la $s0, values #&v[0]
la $s7, endv
li $a0, 0 #sum = 0
loop:
lh $t1, ($s0) #v[X]
li $t2, 2 #$t2 = 2
bgt $t1, $t2, sumPlus
j increment #skip over sumPlus if not > 2
sumPlus:
add $a0, $a0, $t1 #sum += v[x]
increment:
add $s0, $s0, 2 #x++
blt $s0, $s7, loop
答案 0 :(得分:1)
您在endl: .asciiz "\n"
之前有一个换行符和一个空终止符(endv
),因此您要将它们包括在求和数组中。我对MIPS不太了解,但是因为\ n的值为10(十进制),\ 0的值为0。我假设它们是字节,并且正在运行在低端字节序的计算机上,因此,作为带符号的半字,它们被解释为10(十进制)。
我认为只需将endv
标签移动到数组的实际末尾(恰好在endl:
之前)即可解决此问题。