0

文字のASCII値を表示できるプログラムを作ろうとしています。問題は、実際のASCII値が表示されないことです。このコードは、通常のアセンブリ言語と非常によく似たMIPSアセンブリで作成しています。コードは次のとおりです。

.data

User: .asciiz "Bush"
Line: .asciiz "\n"
Address: .word User

.text

main:
li $t0,1
li $t1,2
li $t2,3
li $t3,4
li $t4,5

lb $a0,User($0)
li $v0,1
syscall

la $a0,Line
li $v0,4
syscall

lb $a0,User($t0)
li $v0,1
syscall

la $a0,Line
li $v0,4
syscall

lb $a0,User($t1)

li $v0,1
syscall

la $a0,Line
li $v0,4
syscall

lb $a0,User($t2)

li $v0,1
syscall

la $a0,Line
li $v0,4
syscall

lb $a0,User($t3)

li $v0,1
syscall

la $a0,Line
li $v0,4
syscall

li $t1,-1
jal Length

j Exit

Length:

beq $a0,0,End
addi $t1,$t1,1
lb $a0,User($t1)
j Length

End:
move $a0,$t1
li $v0,1
syscall

jr $ra

Exit:
li $v0,10
syscall

真のASCII値が表示されていない理由として考えられるものは何ですか。さらに、すべての英語のアルファベットのASCII値を検出するプログラムを作成しようとすると、実行時エラーが発生します。誰かがこれを手伝ってくれると、私にとって大きな意味があります。

よろしく

4

2 に答える 2

2

あなたはそれが何をすることを期待していますか、そしてそれは現在何をしていますか?これが私にとっての出力です:

66
117
115
104
0
4

実際の文字を表示したい場合は、1ではなくベクトル11を使用しますsyscall。これは、印刷文字ベクトルです。

B
u
s
h

4

lb $a0,User($0)
li $v0,1
syscall

これにより、のアドレスから1バイトがロードUserされ、に入れられ$a0ます。次に、その値を整数として出力します。の値UserはASCII文字「B」の値であり、66であるため、66と出力されます。これは正しくありませんか?

la $a0,Line
li $v0,4
syscall

これにより、のアドレスがLine$a0なり、そのアドレスに格納されている文字列が出力されます。この場合は改行文字列なので、改行が出力されます。正解です。

lb $a0,User($t0)
li $v0,1
syscall

これは最初のブロックとほぼ同じですが、アドレスオフセットが$t0、この場合は1であり、「B」(「u」)の後にバイトをロードすることを意味します。'u'のASCII値は117であり、それが出力されます。これは正しくありませんか?

これは「ブッシュ」の最初の5文字にも当てはまり(文字列は0値でヌル文字で終了していることを思い出してください)、正しい値が出力されているように見えるので、何が問題なのかを教えてください。

Lengthルーチンにはバグがあり、最初の文字はからUserではなく、からLengthです。そのように順序を変更します。

addi $t1,$t1,1
lb $a0,User($t1)
beq $a0,0,End
j Length

アルファベットについては、別の質問をして、問題の詳細を十分に説明してください。何を試したか、何をするか、何をするかなどです。

于 2012-10-04T01:08:24.393 に答える
2

$s1 はアスキー値です

レジスタ $s1 の文字を表示

  li $v0, 11      #print character
  move $a0, $s1
  syscall

例: $s1="0"=0x30=48 結果: 0 レジスタ $s1 の ASCII 値を 10 進数で表示します

li $v0, 1
move $a0, $s1 
 syscall

例: $s1="0"=0x30=48 結果: 48

于 2016-02-09T17:26:48.957 に答える