0
MIPSの小文字を大文字に変換するプログラムを作成するにはどうすればいいですか?文字列のすべての小文字をMIPSの大文字に変換する方法
小文字のASCIIコードから32を引いて、対応する大文字に変換する必要があることを知っています。説明と
MIPSの小文字を大文字に変換するプログラムを作成するにはどうすればいいですか?文字列のすべての小文字をMIPSの大文字に変換する方法
小文字のASCIIコードから32を引いて、対応する大文字に変換する必要があることを知っています。説明と
コード:
.data
buffer: .space 100
str1: .asciiz "Enter string: "
str2: .asciiz "Capitalized: "
.text
main:
la $a0, str1 # Load and print string asking for string
li $v0, 4
syscall
li $v0, 8 # take in input
la $a0, buffer # load byte space into address
li $a1, 100 # allot the byte space for string
syscall
move $s0, $a0 # save string to s0
li $v0, 4
li $t0, 0
#Loop to capitalize
loop:
lb $t1, buffer($t0) #Load byte from 't0'th position in buffer into $t1
beq $t1, 0, exit #If ends, exit
blt $t1, 'a', not_lower #If less than a, exit
bgt $t1, 'z', not_lower #If greater than z, exit
sub $t1, $t1, 32 #If lowercase, then subtract 32
sb $t1, buffer($t0) #Store it back to 't0'th position in buffer
#if not lower, then increment $t0 and continue
not_lower:
addi $t0, $t0, 1
j loop
exit:
la $a0, str2 # load and print "capitalized" string
li $v0, 4
syscall
move $a0, $s0 # primary address = s0 address (load pointer)
li $v0, 4 # print string
syscall
li $v0, 10 # end program
syscall
レンジチェックのトリックあります: '(C-'A ')<=(' Z ' - ' A ')は(符号なしの比較)は'のみ真です小文字で、その他すべての場合はfalseです( '0'を含む)。 ''a '以下の整数は25を超える符号なしの値にラップされます。ループを終了するには' 0'を別にチェックする必要がありますが、他の両方のブランチをサブ/ブランチに結合することができます。 (MIPSシミュレータ上に命令を保存しませんが、ブランチ遅延スロットを備えた実際のMIPSでは、実際にはコードサイズや分岐予測ミスの可能性があります)。 –
x86のようなマシンではcmp/jccが別々の命令である方がずっと便利なので、2つの別々の数値と比較するには合計4つの命令が必要です。しかし、主な利点は、CPUが予測する条件分岐が少なくなることです。キャラクタが小文字のASCII範囲よりも上か下かにかかわらず実行パスは同じです。 –
また、あなたの入力が既にアルファベットであることを知っているならば、あなたはそのビットをマスクするために '〜0x20'と' AND 'するだけで、大文字の手紙はそのまま残していますが、小文字は大文字に変えます。 (XORを使用して大文字と小文字を区別する、または小文字を強制する)これらのすべてのトリックのx86の例については、[アルファベット文字の大文字と小文字を区別しない](https://stackoverflow.com/a/35936844/224132)を参照してください。 SSE2のSIMDベクトル化バージョンを含む –