【发布时间】:2013-02-01 17:25:06
【问题描述】:
我正在开发一个循环遍历 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
【问题讨论】:
-
你说 $v0 应该保存所有递增值的总和,但这不是 C 代码所做的。它将数组中的所有值加 1。你想要哪个?
-
它们都是真的,循环将值递增 1,而 $v0 则存储所有递增值的总和。因此,如果它可以工作,也许我可以在向 $v0 添加 1 后将新值添加到循环中。
标签: c arrays assembly while-loop mips