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