5

我正在开发一个循环遍历 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
4

1 回答 1

10

To load a value from a memory, you need to call one of the load instructions, (lw, lh or lb for word, half-word and byte). for example:

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

to write a value in memory, you use one of the store commands, for example:

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

loading an address into a register is done using la, for example

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

Now, to manipulate the value in the array, you need to combine the three instructions from above:

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

And another point:

You wrote addi $a1, $zero, 1 # i = i + 1 but this is wrong. What you did is to store the result of $zero + 1 which is 1 into $a1. In order to increment $a1, you need to write addi $a1, $a1, 1 which is "store the result of $a1 + 1 into $a1.

于 2013-02-17T00:57:17.843 回答