总结阵列的元素 - MIPS

时间:2018-02-25 23:09:49

标签: assembly 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并且每个元素都是数组1的所有前面元素的总和(给定代码中的元素,称为数组)。现在这就是我到目前为止所提出的:

# 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

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

1 个答案:

答案 0 :(得分:1)

离开循环时,$t1指向sum[]数组末尾的一个。{1}}。所以使用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。实际上,您希望s3 += s2add $s3, $s3, $s2进行对比。

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

最简单的方法是根本不使用这些寄存器。使用$t0-9和/或$a0-4 / $v0-1作为临时工具。