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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top