2017-10-31 282 views

答えて

2

コード:

.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 
+0

レンジチェックのトリックあります: '(C-'A ')<=(' Z ' - ' A ')は(符号なしの比較)は'のみ真です小文字で、その他すべての場合はfalseです( '0'を含む)。 ''a '以下の整数は25を超える符号なしの値にラップされます。ループを終了するには' 0'を別にチェックする必要がありますが、他の両方のブランチをサブ/ブランチに結合することができます。 (MIPSシミュレータ上に命令を保存しませんが、ブランチ遅延スロットを備えた実際のMIPSでは、実際にはコードサイズや分岐予測ミスの可能性があります)。 –

+0

x86のようなマシンではcmp/jccが別々の命令である方がずっと便利なので、2つの別々の数値と比較するには合計4つの命令が必要です。しかし、主な利点は、CPUが予測する条件分岐が少なくなることです。キャラクタが小文字のASCII範囲よりも上か下かにかかわらず実行パスは同じです。 –

+1

また、あなたの入力が既にアルファベットであることを知っているならば、あなたはそのビットをマスクするために '〜0x20'と' AND 'するだけで、大文字の手紙はそのまま残していますが、小文字は大文字に変えます。 (XORを使用して大文字と小文字を区別する、または小文字を強制する)これらのすべてのトリックのx86の例については、[アルファベット文字の大文字と小文字を区別しない](https://stackoverflow.com/a/35936844/224132)を参照してください。 SSE2のSIMDベクトル化バージョンを含む –

関連する問題