2013-02-17 129 views
3

我正在编写循环访问10个数字的程序。前9个元素的值大于0,第10个元素的值为0.当遇到0时,循环应该中断。通过阵列循环MIPS汇编

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 
+0

你说$ V0应保存所有增加值的总和,但这并不是C代码做什么。它增加数组中的所有值都是1.你想要哪一个? – Gene 2013-02-17 00:35:25

+0

他们两个都是真的,循环将值增加1,$ v0存储所有递增值的总和,所以如果它能工作,也许我可以添加1后,将新值添加到循环中的$ v0 – user2079483 2013-02-17 00:40:06

回答

6

要从内存中加载一个值,你需要调用(对于字,半字和字节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,你需要写addi $a1, $a1, 1是“的$a1 + 1结果存储到$a1

+0

谢谢,这很有帮助,但是如何增加数组的每个循环的偏移量,或者有效地使用索引?编辑:别担心,我看到它 – user2079483 2013-02-17 01:22:36

+0

不要增加偏移量,增加保存数组地址的寄存器(如最后一个lin e我发布的代码示例) – MByD 2013-02-17 01:23:58

+0

是的,刚注意到它。谢谢。 – user2079483 2013-02-17 01:27:19