Pergunta
Em meus MIPs Assembleia Programação de classe I fui encarregado de escrever um programa que converte uma string em porco simplificado Latina.
porco Simplificado Latina assume todas as palavras na seqüência de pelo menos 2 caracteres, e cada palavra tem sua primeira letra deslocado para o final seguido de "ay". Além disso, presuma que não há sinais de pontuação de qualquer tipo.
Assim, "stackoverflow é grande" se torna "tackoverfloway siay reatgay".
Eu tomei uma facada este programa e eu estou quase concluída. Ele funciona muito bem, exceto que, por alguma razão eu tenho uma quebra de linha no meio da última palavra de cada vez.
Por exemplo:
tackoverflowsay siay reat
gay
Em vez de:
tackoverflowsay siay reatgay
Eu tentei decuding o que iria estar causando essa quebra de linha na última parte de saída do meu programa, mas eu não vê-lo. Eu tenho uma string pré-maduro terminada nula? Se eu fizer, eu não vê-lo.
Aqui está o meu 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
Solução
Você quase certamente tem uma série de formulário:
stackoverflow is great\n
onde \n
é um caractere de nova linha. Isto se traduziria em:
tackoverflowsay siahy reat\ngay
Se você detectados de forma simplista o fim da palavra como espaço ou nulo terminador.
Eu não estou indo dar-lhe o código (uma vez que esta é a lição de casa), mas a solução mais fácil, na minha opinião, seria ter um outro ciclo de processamento de toda a cadeia, substituindo todos os caracteres "\n"
com espaços.
Isso seria feito antes de seus loops latinização.