2016-10-05 20 views
0

3つの引数を取る関数を書く。 $a0は正の値であり、intの値であり、$a1は配列であり、$a3は配列のサイズです。私は最初の引数を取ってそれを10進数のasciiに変換する必要があります。その数字を配列に格納します。私は変換する数字がなくなるまでこれを続けます。私は最後の配列アドレスと私が格納した最後のASCII値を返さなければなりません(これは$v0$v1に入れます)。私は間違って何をしていますか?mipsを使用して配列にASCII値を格納する方法は?

uitoa:

li $t0 , 0 
li $t1 , 10 
li $t4 , 48 
li $t8 , 0 
for : 
beq $a0,$t8,finished 
div $a0,$t1 
mfhi $t2 #remainder 
mflo $a0 
add $t3,$t2,$t4 # +48 to ascii 
add $t6 , $t6 , $a1 #address of array? 
sb $t3, 0($t6) 
addi $t6,$t6,1 # increment array ? 
addi $t0, $t0 ,1 
j for 

finished: 

la $v0 , ($t6) 
la $v1 , ($t3) 
+0

*行く*間違っている? – RamenChef

+0

それはsb $ t3,0($ t6)のアドレス範囲外です。 –

答えて

1

add $t6 , $t6 , $a1t6 = t6 + a1ですが、運よくつながる(これはあなたがt6初めて使用するので、それは値が定義されていないだとあなたがバイトを書き込みしようとすると、「範囲外」もし書き込み可能なメモリが偶発的に終わってしまったら、間違った結果とランダムなメモリを上書きして、まったく奇妙な振る舞いを起こす可能性が非常に高いでしょう。

あなたはあなたが先にゼロにt6を設定します場合でも、オフに行くことになる2サイクル目のように、また、あなたは、ループ内add毎サイクル(以前t6を設定するa1アドレスを追加する)ことを行うだろう。

あなただけの終了に進み、ゼロ入力の場合

ていますが、配列に単一'0'文字を格納しませんし、どちらもt6t3は初期化され(ただし、使用されます)。

終了時la v1,(t3)はメモリを読み取りますか?私はt3v1にコピーすることを意図したと思いますか?だからレジスタから負荷を使用する(mipsニーモニックについてはわからない、私はmips asmを学んだことがない)。

t0は何も使用しません。

ループ内の数字を10で割ると、数字が後方に表示されますが、配列を徐々に埋めるように見えます。

あなたは何をすべきか理解しているようですが、すぐに指示を出し始めました。しばらく停止してアルゴリズムをいくつかの簡単なステップに分割し、行コメント全体としてコードに書いてから、さまざまなトリッキーな入力(0,1,10、max_positive_int)を行って、ロジックがOK(Rubber duck programming)であることを確認してください。必要な値をステップごとに追加し、単純化し、初期化する必要があるメモをとり、レジスタを割り当てます。

その後、これらの手順の手順を記述し、デバッガでデバッグしてすべてが意図どおりに機能することを確認するだけです。

ご存知のように、デバッガで一度でも実行するのは面倒ではないようです。それはアセンブリプログラミングがどのように機能するかではなく、特にあなたが学習している場合です。これはまた質問のdownvotes(質問する前に十分な努力を示していません)、私は気にしませんが、私はむしろ回答を理解する努力を示していない人々をdownvoteしたいと考えています:D

+0

配列の後方書き込みにどのように取り組んでいるのでしょうか、何を本当にエレガントに考えることはできませんcharsが格納されるので、後ろに書いて最後に逆に書き出すか、最後から書き込むか(a1 + a3-1)、a1 + 0の方にコンテンツを移動しますか?他のオプションは、計算された数字をスタックに数えて保存し、ゼロに達した後、スタックから1つずつポップし、最初から配列を塗りつぶすことです(さらに、v0/v1の戻り値に適切な値おそらく文字列の右端の数字を参照する必要があります)。 – Ped7g

関連する問題