循环遍历MIPS汇编中的数组

5

我正在编写一个程序,它会循环遍历一个包含10个数字的数组。前9个元素的值都大于0,第10个元素的值为0。当循环到第10个元素时,程序应该停止循环。

i=0;
while(A[i]!=0)
{
    A[i]=A[i]+1;
    i++;
}

我知道可以使用“beq”来在寄存器的值等于0时跳出循环。但是我不太了解如何操作内存中的值。

这是我第一次使用MIPS,你会发现它很混乱。如果你不能帮我修复它,能否给我一些指导?

.data  #by default, the "data segment" starts at address 0x10010000
.word 1
.word 2
.word 3
.word 4
.word 5
.word 6
.word 7
.word 8
.word 9
.word 0

.text #instructions start below

# MIPS assembly code

lui  $a0, 0x1001           # $a0 = 0x10010000
addi $a1, $zero, 0         # i = 0
jal increment              # call the procedure

这里是我最困惑的地方:
increment:
lui $a0, 0x1001           # $a0 = 0x10010000
beq $a0, $zero, else      # if $a0 holds 0 goto 'else'
addi $a0, $a0, 2          # +2
addi $a1, $zero, 1        # i = i + 1

jr $ra                   #jump to caller

$v0应该保存所有递增值的总和。

else: 
add $a0, $v0, $zero #copy result as input to syscall
addi $v0,$zero,1 #service 1 for syscall is print integer
syscall

无限循环结束。

infinite: j infinite

你说$v0应该保存所有递增值的总和,但这不是C代码所做的。它将数组中的所有值都加1。你想要哪一个? - Gene
两个都很重要,一个是循环递增数值加1,另一个是$v0变量用来存储所有递增数值的总和。所以,如果可以的话,在循环中把新数值加上1后再加入$v0变量中可能是可行的。 - user2079483
1个回答

11

要从内存中加载一个值,您需要调用其中一个加载指令(lwlhlb,分别代表字、半字和字节)。例如:

lw $a1, 0($a2) # load a word from the address in $a2 + offset 0 to $a1

要在内存中写入一个值,您可以使用其中一个存储命令,例如:

sw $a1, 0($a2) # store the word in $a1 into the address in $a2 + offset

使用la指令将地址加载到寄存器中,例如:

la $a2, label_of_array # load the address of the label 'label_of_array' into $a2

现在,要操纵数组中的值,您需要将上述三个指令结合起来:

la $a1, label_of_array   # load the address of the array into $a1
lb $a2, 0($a1)           # load a byte from the array into $a2
addi $a2, $a2, 1         # increment $a2 by 1
sb $a2, 0($a1)           # store the new value into memory
addi $a1, $a1, 1         # increment $a1 by one, to point to the next element in the array

还有一个要点:

你写的是addi $a1, $zero, 1 # i = i + 1,但这是错误的。你做的是将$zero + 1的结果 1存储到$a1中。要想增加$a1的值,你需要写addi $a1, $a1, 1,它的意思是“将$a1 + 1的结果存储到$a1中”。


谢谢,这很有帮助。但是我如何在每次循环数组时增加偏移量,或有效地使用索引?编辑:不用担心,我已经看到了。 - user2079483
不要增加偏移量,而是增加保存数组地址的寄存器(就像我发布的代码示例的最后一行那样)。 - MByD
是的,刚注意到了。谢谢。 - user2079483

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接