MIPS - 访问存储在数组中的数据
MIPS - Accessing data stored in an array
我一直在使用Whosebug 帮助做作业,但这次找不到答案。
我以为一切正常,但是当我更改数组中的元素时它什么也没做。
在我的程序中,我必须初始化数组,打印出数组,然后调用一个方法来对数组中的元素求和。我要传两个参数,一个是数组的基地址,一个是数组的长度
这是我目前的代码。它只是通过长度打印出 1,而忽略数组中的实际内容。
.data
array: .word 2, 4, 6, 8, 10
newline:.asciiz "\n"
space: .asciiz " "
.text
la $a0, array # $a0 -----> array
li $a1, 5 # $a1 -----> length of array
jal SUM # calls sum
j end
SUM:
move $t0, $a0 # $t0 -----> $a0 ( array )
move $t1, $a1 # $t1 -----> $a1 ( length of array )
li $t2, 0 # $t2 -----> 0 ( i = 0 )
li $t3, 0 # $t3 -----> 0 ( sum = 0 )
loop:
beq $t1, $t2, endloop # checks to see if length of array == i
mul $t4, $t2, 4 # multiply i by 4, so offset stays with array in loop
add $t4, $t0, $t4 # puts memory address of array into $t3 so we get array [i]
sw $t4, ($t4) # loads memory address of array[i] into $t3
addi $t2, $t2, 1 # i++;
add $t3, $t3, $t2 # sum = sum + array [i];
li $v0, 1 # prints value
move $a0, $t2 # at
syscall # array[i]
li $v0, 4 # prints
la $a0, space # a
syscall # space
j loop
endloop:
li $v0, 4 # prints
la $a0, newline # a
syscall # new line
li $v0, 1 # prints value
add $a0, $t3, [=10=] # of
syscall # sum
jr $ra
end:
抱歉评论的格式问题,我不知道如何对齐它们。
您有几个错误:
sw $t4, ($t4) # loads memory address of array[i] into $t3
这与评论不符。此外,您不应将该值加载到 $t3 中,因为您会覆盖总和 (# $t3 -----> 0 ( sum = 0 )
)。我会使用 $t5,所以它应该是这样的:
lw $t5, ($t4)
此外,您将索引添加到总和而不是实际数组值:
add $t3, $t3, $t2
加上之前使用LW修正,应该是:
add $t3, $t3, $t5
最后,您还要打印索引而不是值:
move $a0, $t2
应该是
move $a0, $t5
PS:使用分支循环,不跳转。跳转一般用于函数调用或者远调用。
PS2: 使用系统调用 10 结束程序。
PS3:您还应该阅读 MIPS delay slot。
我一直在使用Whosebug 帮助做作业,但这次找不到答案。
我以为一切正常,但是当我更改数组中的元素时它什么也没做。
在我的程序中,我必须初始化数组,打印出数组,然后调用一个方法来对数组中的元素求和。我要传两个参数,一个是数组的基地址,一个是数组的长度
这是我目前的代码。它只是通过长度打印出 1,而忽略数组中的实际内容。
.data
array: .word 2, 4, 6, 8, 10
newline:.asciiz "\n"
space: .asciiz " "
.text
la $a0, array # $a0 -----> array
li $a1, 5 # $a1 -----> length of array
jal SUM # calls sum
j end
SUM:
move $t0, $a0 # $t0 -----> $a0 ( array )
move $t1, $a1 # $t1 -----> $a1 ( length of array )
li $t2, 0 # $t2 -----> 0 ( i = 0 )
li $t3, 0 # $t3 -----> 0 ( sum = 0 )
loop:
beq $t1, $t2, endloop # checks to see if length of array == i
mul $t4, $t2, 4 # multiply i by 4, so offset stays with array in loop
add $t4, $t0, $t4 # puts memory address of array into $t3 so we get array [i]
sw $t4, ($t4) # loads memory address of array[i] into $t3
addi $t2, $t2, 1 # i++;
add $t3, $t3, $t2 # sum = sum + array [i];
li $v0, 1 # prints value
move $a0, $t2 # at
syscall # array[i]
li $v0, 4 # prints
la $a0, space # a
syscall # space
j loop
endloop:
li $v0, 4 # prints
la $a0, newline # a
syscall # new line
li $v0, 1 # prints value
add $a0, $t3, [=10=] # of
syscall # sum
jr $ra
end:
抱歉评论的格式问题,我不知道如何对齐它们。
您有几个错误:
sw $t4, ($t4) # loads memory address of array[i] into $t3
这与评论不符。此外,您不应将该值加载到 $t3 中,因为您会覆盖总和 (# $t3 -----> 0 ( sum = 0 )
)。我会使用 $t5,所以它应该是这样的:
lw $t5, ($t4)
此外,您将索引添加到总和而不是实际数组值:
add $t3, $t3, $t2
加上之前使用LW修正,应该是:
add $t3, $t3, $t5
最后,您还要打印索引而不是值:
move $a0, $t2
应该是
move $a0, $t5
PS:使用分支循环,不跳转。跳转一般用于函数调用或者远调用。
PS2: 使用系统调用 10 结束程序。
PS3:您还应该阅读 MIPS delay slot。