对数组的元素求和 - 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
作为临时变量。
所以我从这段代码开始,它构建了一个包含 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
作为临时变量。