2009-04-01 14 views
0

Dans ma classe de programmation d'assemblages MIPs, j'ai été chargé d'écrire un programme qui convertit une chaîne en latin pig simplifié.Pig Latin dans l'assemblage MIPS

Le latin de porc simplifié suppose que tous les mots de la chaîne ont au moins 2 caractères, et que chaque mot a sa première lettre décalée à la fin suivie de "ay". En outre, supposons qu'il n'y a aucune marque de ponctuation d'aucune sorte. Ainsi, "stackoverflow is great" devient "tackoverfloway siay reatgay".

J'ai pris un coup à ce programme et je suis presque terminé. Cela fonctionne bien, sauf que, pour une raison quelconque, j'ai un saut de ligne au milieu du dernier mot à chaque fois.

Par exemple:

tackoverflowsay siay rande
gay

Au lieu de:

tackoverflowsay siay reatgay

J'ai essayé Décrire ce qui causerait cette rupture de ligne dans la dernière partie de sortie de mon programme, mais je ne le vois pas. Est-ce que j'ai une chaîne terminée par zéro prénatale? Si je le fais, je ne le vois pas.

Voici mon code:

#################################################### 
# 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 

Répondre

2

Vous avez certainement une chaîne de la forme:

stackoverflow is great\n 

\n est un retour à la ligne. Cela se traduirait par:

tackoverflowsay siahy reat\ngay 

si vous détectez la fin de simplistes mot soit comme espace ou terminaison null. Je ne vais pas vous donner le code (puisque c'est devoirs) mais la solution la plus simple, à mon avis, serait d'avoir une autre boucle traitant la chaîne entière, remplaçant tous les caractères "\n" par des espaces.

Ceci serait fait avant vos boucles de latinisation.

+0

hanks Pax, Vous m'a donné plus qu'assez pour le résoudre. Je pensais avoir écrasé le terminateur null mais je suppose que non. – KingNestor