我正在研究一个循环通过10个数字的数组的程序。前9个元素的值大于0,第10个元素的值为0.当遇到0时,循环应该中断。
i=0;
while(A[i]!=0)
{
A[i]=A[i]+1;
i++;
}
我知道如果寄存器的值等于0,我可以使用'beq'来打破循环。但是我不太了解操作内存中的值。
这是我第一次使用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
答案 0 :(得分:6)
要从内存加载值,您需要调用其中一个加载指令(lw
,lh
或lb
来表示字,半字和字节)。例如:
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
。