2016-08-15 10 views
0

MIPS MARS 4.5で挿入ソートを実行しようとしています。配列値を別の配列値にロードする

A:

私はと特異的にいくつかのトラブルを抱えている

lw myArray($s4), myArray($s6)# alist[position] = alist[position-1] 

B:

lw myArray($s4), $s5 # alist[position] = current value 

私は取得しています問題は、「あまりにも多くのか、正しくフォーマットされたオペランドであります"、" myArrayオペランドの型が間違っています "をそれぞれ示しています。

基本的に私は展覧会Aで何をしようとしているのかはコメントに記載されていますが、私はmyArray($ s4)= myArray($ s6)を作ろうとしていますが、また、私はそれを移動するために追加しようとしました。展示BIのために

$ S5で値にmyarrayの($のS4)の値を変更したい

オペレータIで私を助けることができる誰でもここで使うはずですか? ありがとう

必要に応じて、以下の残りの機能をリンクしました。

もう一度おねがいします。

sort: 
    addi $sp, $sp, -32  # save values on stack 
    sw $ra, 0($sp)  # Store the saved values on the stack to restore when done 
    sw $s0, 4($sp)  # s0 = base address of array 
    sw $s1, 8($sp)  # s1 = size of array 
    sw $s2, 12($sp)  # s2 = i 
    sw $s3, 16($sp)  # s3 = j 
    sw $s4, 20($sp)  # s4 = position 
    sw $s5, 24($sp)  # s5 = currentvalue 
    sw $s6, 28($sp)  # s6 = position - 1 

    la $a0, myArray  # load array address into a0 
    la $a1, myArray($s2) # load size of array into a1 
    move $s0, $a0  # move array address into s0 
    move $s1, $a1  # move size of array into s1 
    li $s2, 0   # set i to 0 
    li $s3, 0   # set j to 0 
    li $t0, 0   # set t0 to 0 
iloop: 
# if s1 >= size of array go to end 
    slt $t5, $s2, $s1  # check if a1 > s2 
    beq $t5, 0, endWhile # if it is, jump to the end 

    lw $s5, myArray($s2) # currentvalue = alist[i] 
    add $s4, $zero, $s2  # position = i 
    sub $s6, $s4, 4  # position - 1 
    j jloop   # else go to jloop 
jloop: 
# if position is <= 0 
    slt $t5, $s4, $t0  # check if s4 is greater than 0 
    beq $t5, 0, iloop  # if its less, jump to the end     
# and alist[position-1] < currentvalue 
    slt $t5, $s6, $s5  # check if alist[position-1] > current value 
    beq $t5, 0, iloop  # if less than jump back to iloop 
    lw myArray($s4), myArray($s6)# alist[position] = alist[position-1] 
    sub $s4, $s4, 1  # position = position - 1 
    j setArray 
setArray: 
    lw myArray($s4), $s5 # alist[position] = current value 
    j iloop 
endWhile: 

答えて

1

(免責事項:私はMIPSアセンブラをやったことがないので、私はちょうどそれならば私に知らせて、したがって、私はいくつかの愚かな間違いや構文エラーを行うには非常に脆弱だけど、私の他のアセンブリの知識とwikiを以下のよ動作しません)

lw myArray($s4), myArray($s6) - "ロード/ストア"(移動)の両側のメモリにアクセスすることはできません。それは、CPUにあまりだが、唯一の1辺は、メモリアクセスすることができ、他は

lw $t5,myArray($s6) # $t5 set to alist[position-1] 
sw $t5,myArray($s4) # alist[position] set to $t5 

lw myArray($s4), $s5を登録する必要があります - これは「メモリに負荷値v」と書かれ、それは人間のロジックで保存値」と同じですv into memory "になりますが、MIPSには2番目の方法しかありません:sw $s5,myArray($s4)


その他の注意事項: なぜあなたの代わりに、一時的な$t#を使用して、すべての$s#レジスタを乱雑にしますか? $t#の値を保存/復元する必要はありません。そのため、長いinit(および問題に含める場合は長い終了)からあなたを救うでしょう。

0の代わりにおそらく$zeroを使用してください。 (アセンブラがli $s2,0add $s2,$zero,$zeroに変更するのに十分なほど賢明でない場合)MIPSが他の古いCPUデザインの近くにある場合は、 )2の間に違いを作る

myArrayがハードコーディングされた中で、あなたが$a0, $a1

slt $t5, $s2, $s1 # check if a1 > s2から引数として配列ポインタと、それのサイズを取って、この手順を行うことができないのはなぜ - 。??これをしませんあなたがこれを1年後に読んでいれば、あなたはその言葉がばかげている(正しい、明白で無駄な)ことを知るでしょう。

お試し# check if size (a1) > i (s2)お試しください。これは、より良い方法ですが、sltのロジックを反転します。だから# set t5 if i (s2) < array size (s1)私の最後の提案です(私はまたa1を取り除いてしまったことに注意してください、もう使用しないので)。

編集:問題のある行で あなたが右のそれをやったlw myArray($s4), myArray($s6)# alist[position] = alist[position-1]、あなたが(MIPS ASMを知っている誰のために明白である)命令が何をするかコメントしませんが、ことによって達成するためにあなたの人間の意図だったかコメントしますその命令。このようにしてください。しかし、このようにすべての行にコメントするのが難しくなることがあるかもしれません。いくつかの行は自然にグループ化されています(例えば、slt + beq)。

実際には、このアルゴリズムを使用して、ASM命令なしで単純な手順でアルゴリズムを作成したり、特定のレジスタの使用にコミットしたり、純粋なコメントだけを使用したりすることができます。次に、レジスタの使用量を決定します(主値用)。それを達成するための具体的な指示を各コメントに記入してください。アルゴリズム、構文、およびレジスタの割り当てをすべて同時にしようとすると、あなたの頭の中であまりにも多くの細部が圧倒されることはありません。

関連する問題