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

lwメモリから値をロードするには、ロード命令の1つ( 、lhまたはlbワード、ハーフワード、バイト)を呼び出す必要があります。例えば:

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

メモリに値を書き込むには、次のようなストアコマンドの1つを使用します。

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

ここで、配列の値を操作するには、上記の3つの命令を組み合わせる必要があります。

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$a1addi $a1, $a1, 1$a1 + 1$a1

于 2013-02-17T00:57:17.843 に答える