对数组的元素求和 - MIPS

Summing elements of the array - MIPS

所以我从这段代码开始,它构建了一个包含 20 个元素的数组 - 整数 1 到 20。

# initialise array
.text
main: la $t0,array
 li $s2,1
 li $s4,20
loop: bgt $s2, $s4, end
sw $s2,0($t0)
addi $s2, $s2, 1
addi $t0, $t0, 4
j loop
end:
 li $v0,10
 syscall
 .data
nl: .asciiz "\n"
 .word 255 # give a recognisable bit pattern
array: .space 80

现在我应该做的是创建另一个大小为 20 的数组,并让每个元素都是数组一(给定代码中的数组,称为数组)的所有前面元素的总和。现在这是我到目前为止想出的:

# initialise array
    .text
main:   la $t0,array
    la $t1,sum
    li $s2,1
        li $s4,20
loop:   bgt $s2, $s4, end
    sw $zero,0($t0) 
    add $s3,$s2,$t0
    sw $s3,0($t1)
        sw $s2,0($t0)
    addi $s2, $s2, 1
    addi $t0, $t0, 4
    addi $t1, $t1, 4
        j loop
end:
    li  $v0, 1 
    lw $s3, 0($t1) 
    add $a0, $s3, $zero  # print final value in sum
    syscall
        li $v0,10
        syscall
       .data
nl:      .asciiz "\n"
    .word 255 # give a recognisable bit pattern
array:  .space 80
sum:    .space 80

现在最后我想打印新数组的最后一个元素的值(总和),对于 20 个元素的数组,它应该等于 210(所有先前整数的总和)但此时我得到0,我真的不知道问题出在哪里(现在我才开始用 mips 做任何事情,我对任何事情都知之甚少)。

当您离开循环时,$t1 指向 sum[] 数组末尾的一个。所以使用lw $s3, -4($t1)。 (另外,为什么不直接加载到 $a0 而不是加载到 $s3 然后复制到 $a0?)

或者更好的是,完全省略加载,因为您仍然有最后一个元素存储在循环体的 $s3 中。所以保留 add $a0, $s3, $zero # print final value in sum 并删除 lw.


修复后,您会注意到另一个错误:您一直在将 s3 = i + &array[i] 设置为 add $s3,$s2,$t0。你实际上想用 add $s3, $s3, $s2.

s3 += s2

此外,您使用的 $s 寄存器没有 saving/restoring 它们。这没关系,因为您使用系统调用退出而不是从 main 返回,但是 returns 的任何函数都应该这样做,所有 $s0-7 寄存器都具有其原始值。 MIPS registers.

最简单的方法是根本不使用这些寄存器。使用 $t0-9 and/or $a0-4 / $v0-1 作为临时变量。