0

MIPS で配列を理解しようとしています。スタック ポインターを 1 ワード前または後ろ (4 ずつ) に移動する必要があることはわかっています。しかし、そのアイデアを MIPS コードに実装する方法がわかりません。

 j = 0
 x = a[j+k]
 a[j+k] = a[j]

私が確かに知っていることは、0 をレジスター (j=0) にロードすることです。次に、ベースアドレス $a0 という単語をロードして a[j] を作成し、sw の前に k を追加して、その値を 0($ a0)。

li $t0, 0       
lw $t0 0($a0)
add $t0, $t0, $a2
sw $t0, ($a0)

このコードを MIPS に変換するように割り当てられましたが、前のコードはその最初の部分でした。

# Register usage
# $a0 = base address of array
# $a1 = n, size of array
# $a2 = k, the shift amount

# j = 0
# x = a[j+k]
# a[j+k] = a[j]
# repeat n-1 times
#   j = (j+k) mod n
#   m = (j+k) mod n
#   y = a[m]
#   a[m] = x
#   x = y
# end repeat

私の質問は、MIPS で n-1 回のループを行うにはどうすればよいですか? それは条件ですか?

subi $a1 $a1

最後に、mod を見つける方法を教えてください。私はそれがdivと$ HIであると信じています。これは私がこれまでに持っているものです。

add $t1, $t0, $a2    #j+k
div $t1, $a1         #divide (j+k) by n
mfhi $t2             #move rem into t2
move $t2, $t0        #j = (j+k) mod n

add $t1, $t0, $a2    #j+k
div $t1, $a1         #divide (j+k) by n
mfhi $t2             #move rem into t2
move $t2, $t0        #m = (j+k) mod n

sw $t0, 0($t0)
lw $t3, 0($t0)

私は自分自身を混乱させています。明確化していただければ幸いです。

4

1 に答える 1

1
li $t3, 0       #j = 0
lw $t3, 0($a0)     #load the value of @a0 in to j
add $t3, $t3, $a2  # j = j+k
sw $t3, 4($a0)     # store the new value of j in to $a0

loop:
beq $a1, $zero, return
sub $a1, $a1, 1      #n = n-1
add $t4, $t3, $a2    #j+k
div $t4, $a1         #divide (j+k) by n
mfhi $t5        

move $t5, $t3        #j = (j+k) mod n


 add $t4, $t3, $a2    #j+k
 div $t4, $a1         #divide (j+k) by n
 mfhi $t5             #move rem into t2
 move $t5, $t3        #m = (j+k) mod n
 b loop

return:
sw $t3, 4($a0)
jr $ra
lw $t3, 0($a0)

私はあなたのコードをここで見ました。プログラムを実行しましたが、出力が間違っていて、条件でエラーが発生し、修正するとプログラムが出力を返さなくなりました。レジスターを交換しました。

于 2012-04-07T01:40:08.507 に答える