所以我从这个代码开始,它构建了一个包含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做任何事情而且我对任何事情都知之甚少。)
答案 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 += s2
与add $s3, $s3, $s2
进行对比。
此外,您还在使用$s
寄存器而不保存/恢复它们。这是正常的,因为您使用系统调用退出而不是从main
返回,但任何返回的函数都应该这样做,所有$s0-7
寄存器都具有其原始值。 MIPS registers
最简单的方法是根本不使用这些寄存器。使用$t0-9
和/或$a0-4
/ $v0-1
作为临时工具。