在我的 MIP 汇编编程课程中,我的任务是编写一个将字符串转换为简化的拉丁语的程序。
简化的猪拉丁语假设字符串中的所有单词至少有 2 个字符长,并且每个单词的第一个字母都移到末尾,然后是“ay”。另外,假设没有任何类型的标点符号。
因此,“stackoverflow 很棒”变成了“tackoverfloway siay reatgay”。
我已经对这个程序进行了尝试,我几乎完成了。它工作正常,除了由于某种原因我每次在最后一个单词的中间都有一个换行符。
例如:
tackoverflowsay siay reat
gay
代替:
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