Latín de cerdo en la Asamblea MIPS
Pregunta
En mi clase de programación en ensamblador MIPS He recibido el encargo de escribir un programa que convierte una cadena en simplificado cerdo latino.
cerdo simplificado latino asume todas las palabras de la cadena son al menos 2 caracteres de longitud, y cada palabra tiene su primera letra se movió hasta el final, seguido de "ay". Además, asumen que no hay signos de puntuación de ningún tipo.
Por lo tanto, "stackoverflow es grande" se convierte en "tackoverfloway Siay reatgay".
Me he tomado una puñalada en este programa y yo estoy casi completado. Funciona bien, excepto que por alguna razón tengo un salto de línea en el medio de la última palabra en todo momento.
Por ejemplo:
tackoverflowsay Siay randes
Gay
En lugar de:
tackoverflowsay Siay reatgay
He intentado decuding lo que sería la causa de este salto de línea en la última parte de salida de mi programa, pero yo no lo veo. ¿Tengo una cadena nula prematuro terminado? Si lo hago, no lo veo.
Aquí está mi código:
####################################################
# 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
Solución
es casi seguro que tiene una cadena de la forma:
stackoverflow is great\n
donde \n
es un carácter de nueva línea. Esto se traduciría en:
tackoverflowsay siahy reat\ngay
Si detecta de manera simplista el final de la palabra, ya sea como el espacio o el terminador nulo.
No voy a darle el código (ya que esta es la tarea), pero la solución más fácil, en mi opinión, sería tener otro bucle del procesamiento de toda la cadena, en sustitución de todos los caracteres con espacios "\n"
.
Esto se haría antes de que sus bucles latinización.