В моем классе MIPs Assembly Programming мне было поручено написать программу, которая преобразует строку в упрощенную латиницу.
Упрощенная латинская лексика предполагает, что все слова в строке имеют длину не менее 2 символов, и каждое слово имеет свою первую букву, сдвинутую в конец, за которой следует «ay». Также предположим, что знаков препинания нет.
Таким образом, "stackoverflow велик" становится "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