2013-11-21 7 views
5

バウンティ:このサブルーチンを負の数で動作させるためのコードを提供する人の評判ポイントは+50点です。itoaは負の数ですか?

私は華氏を摂氏に変換するMIPSプログラムを作成しました。独自の出力ウィンドウ(UART)を開き、摂氏で値を正しく表示します。これは、Cからアセンブリへの呼び出しとその逆の呼び出しのすべてを行います。下に掲載された全コード。

私はそれが負の数で動作するように苦労しています。今何らかの理由で空白を描いているだけです。このチェックを書くために私のitoa関数を変更するにはどうすればよいですか?

MIPSで負の値でこれを動作させる方法はありますか?

.ent itoa 
itoa: 
    // putting the stack frame together 
    addiu sp, sp, -16 
    sw fp, 12(sp) 
    move fp, sp 
    sw a0, 16(fp) 
    sw a1, 20(fp) 
    sw s0, 4(fp) 
    sw s1, 0(sp) 

    // there is no divide immediate, so using s1 
    li s1, 10 

    itoa_div_begin: 
     divu a0, s1 
     mfhi s0 
     mflo a0 

     addiu s0, s0, 0x30 
     addiu sp, sp, -1 
     sb s0, 0(sp) 

     beq a0, zero, itoa_div_done 
     nop 

     j  itoa_div_begin 
     nop 

    itoa_div_done: 
    itoa_copy_begin: 
     lb s0, 0(sp) 
     sb s0, 0(a1) 

     addiu sp, sp, 1 
     subu s1, sp, fp 
     addiu a1, a1, 1 

     beq s1, zero, itoa_copy_done 
     nop 

     j  itoa_copy_begin 
     nop 

    itoa_copy_done: 
    li s0, 0 
    sb s0, 0(a1) 

    move v0, a1 

    lw a0, 16(fp) 
    lw a1, 20(fp) 
    lw s0, 4(fp) 
    lw s1, 0(fp) 
    // stack frame 
    move sp, fp 
    lw fp, 12(sp) 
    addiu sp, sp, 16 

    jr ra 
    nop 

.end itoa 
+2

あなたはコードを与えられませんが、あなたは陰性のためにmsbをチェックし、次に2の補数を元に戻す必要があります。http://en.wikipedia.org/wiki/Two%負の整数の絶対値を取得します。要するに、msbが1 - > '' 'を書いて、itoaに逆の2の補数を使用すると、 – x4rf41

+0

私は混乱しています、問題はちょうどあなたのitoa関数ですか? –

+1

@KonradLindenbachはい。プログラム全体を投稿することについて申し訳ありません。それ以来、itoaサブルーチンのみを編集しています。 – MrPickle5

答えて

6

あなたは右itoa_div_beginの上に、あなたのコードでこれを含めることができます。

li t0, 0x40000000 
and t0, a0, t0 
beqz t0, itoa_div_begin 
nop 
li t0, 45 
sb t0, 0(a1) 
addi a1, a1, 1 
not a0, a0 
addi a0, a0, 1 

itoa_div_begin: 

何であることはありません:負の数の

  • チェックをMSBが1
  • であるかどうかをチェックすることにより、
  • その場合は、結果に-を挿入し、
  • 関数の残りの部分の数の補数です。