2013-02-17 82 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