私の MIPs アセンブリ プログラミング クラスでは、文字列を単純化されたピッグ ラテン語に変換するプログラムを作成する任務を負っています。
簡略化された豚ラテン語では、文字列内のすべての単語が少なくとも 2 文字の長さであり、すべての単語の最初の文字が最後にシフトされ、その後に「ay」が続くと想定されます。また、いかなる種類の句読点もないと仮定します。
つまり、「stackoverflow is great」は「tackoverfloway siay reatgay」になります。
私はこのプログラムを試してみましたが、ほぼ完了しています。何らかの理由で毎回最後の単語の途中で改行があることを除いて、それは正常に機能します。
例えば:
tackoverflowsay siay reat
ゲイ
それ以外の:
tackoverflowsay siay reatgay
プログラムの最後の終了部分でこの改行の原因を突き止めようとしましたが、わかりません。未熟なヌル終了文字列がありますか? もしそうなら、私はそれを見ません。
これが私のコードです:
####################################################
# Text Segment
####################################################
.text
.globl main
main:
la $t0, char
la $t1, buffer
lb $t3, space
la $a0, prompt
li $v0, 4
syscall
la $a0, buffer
li $a1, 200
li $v0, 8
syscall
lb $t2, ($t1) # Load first char
addi $t1, $t1, 1
loop:
lb $t4, ($t1) # Load next character into $t4
addi $t1, $t1, 1
beqz $t4, exit # Reached end of string, exit?
beq $t3, $t4, loop2 # If $t4 = " " char, second loop
move $a0, $t4 # else, lets keep printing chars
li $v0, 11
syscall
j loop
loop2:
move $a0, $t2
li $v0, 11
syscall
la $a0, aystr
li $v0, 4
syscall
lb $t2, ($t1)
addi $t1, $t1, 1
j loop
exit:
move $a0, $t2
li $v0, 11
syscall
la $a0, aystr
li $v0, 4
syscall
li $v0, 10
syscall # Cya...
####################################################
# Data Segment
####################################################
.data
prompt: .asciiz "Enter Phrase: "
result: .asciiz "Pig Latin: "
space: .ascii " "
aystr: .asciiz "ay "
char: .byte 1
buffer: .byte 200