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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top