如何在MIPS中获取常量的地址?

时间:2018-12-11 01:12:28

标签: mips

我正在尝试在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

1 个答案:

答案 0 :(得分:1)

您在endl: .asciiz "\n"之前有一个换行符和一个空终止符(endv),因此您要将它们包括在求和数组中。我对MIPS不太了解,但是因为\ n的值为10(十进制),\ 0的值为0。我假设它们是字节,并且正在运行在低端字节序的计算机上,因此,作为带符号的半字,它们被解释为10(十进制)。

我认为只需将endv标签移动到数组的实际末尾(恰好在endl:之前)即可解决此问题。