0

私は、数値をASCII文字列から整数に変換するmipsプログラムに取り組んでおり、正と負の整数の10進文字列を受け入れる必要があるというパラメーターを使用しています。これは非常に一般的な課題であることは承知していますが、オンラインで問題を解決できませんでした。いくつかのヒントを得ることができましたが、プログラムを実行しようとするとエラーが発生します。

現時点で私が持っているコードは次のとおりです。

main:    # convert string to integer
li $t6, 0x00    # $t6 = 0
li $t7, 0x09    # $t7 = 9
li $v0, 0x00    # initialize $v0 = 0
move $t0, $a0   # $t0 = pointer to string
lb $t1, ($t0)   # load $t1 = digit character

loop:
blt $t1, $t6, Done  # char < 0
bgt $t1, $t7, Done  # char > 9
subu $t1, $t1, $t6   # convert char to int
mul $v0, $v0, 10    # multiply by 10
add $v0, $v0, $t1   # $v0 = $v0 * 10 + digit
addiu $t0, $t0, 1   # point to next char
lb $t1, ($t0)        # load $t1 = next digit
bne $t1, $0, loop   # repeat if not end of string
jr $ra   # return integer

Done:          #exit program if string not a number
li $v0, -1      # return -1 in $v0
jr $ra

これを実行しようとすると大量のエラーが発生しますが、その理由がわかりません。mips で書くのはこれが初めてなので、感覚がありません。任意のヒント?ありがとう!

理解できるエラーを修正しました。私の地域にはTAもチューターもいません。可能であれば、これを理解する手助けをしたいと思います。建設的な回答をいただければ幸いです。

4

1 に答える 1

1

あなたが提供したコードは、符号なし(正)の整数を asciiz バッファから整数に変換しようとします。数字 '0 と '9' に間違った定数を指定したため、失敗します。ASCII テーブルの '0' はコード 0x30 を使用し、'9' はコード 0x39 を使用するか、代わりに '0' と '9' を使用してこれらの即値をロードします。

したがって、プログラムを修正するには、次を使用する必要があります。

li $t6, '0'    # $t6 = 0x30
li $t7, '9'    # $t7 = 0x39

ルーチンが負の整数を正しく解析できるようにするには、次のことを行う必要があります。

  • 最初の入力文字を読み取って、それがマイナス記号「-」であるかどうかを確認し、未使用のレジスタにこの比較の結果を設定する可能性があります。負の数の場合、ポインターを次の文字に移動します
  • 数値が負の場合を考慮する必要があることを除いて、これまでと同様に文字列の解析を続けます。発行する代わりに数値が負の場合は、発行$v0 = $v0 * 10 + digitする必要があります$v0 = $v0 * 10 - digit
于 2012-11-12T15:13:27.740 に答える