2012-04-06 20 views
0

MIPSの配列を理解しようとしています。スタックポインタを1ワード前に移動する必要があることを知っています(4ずつインクリメント)。しかし、私はMIPSコードにそのアイデアを実装する方法を知らない。私は確かに知っている何MIPSの配列を実装するのに役立つ

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

、あなたが前にそれにKを追加し、その後、私はあなたが単語ベース・アドレス$ A0をロードし、[j]を作ると思いますが、(J = 0)レジスタに0をロードすることですその値を0($ a0)にします。

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

私たちはこのコードをMIPSに変換するように割り当てられていました。前のコードは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 

最後にどのようにモードを見つけるには?私はそれが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) 

私は自分自身を混乱させています。明確化が認められるだろう。

答えて

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) 

ここでは、コードを見たことがあります。私はプログラムを実行していたが、出力が間違っていたので、私は条件で作られたエラーを見て、それを修正しても、プログラムは出力しなくなった。私はレジスタを変更しました。

関連する問題