Свинья латынь в Ассамблее MIPS - PullRequest
0 голосов
/ 01 апреля 2009

В моем классе MIPs Assembly Programming мне было поручено написать программу, которая преобразует строку в упрощенную латиницу.

Упрощенная латинская лексика предполагает, что все слова в строке имеют длину не менее 2 символов, и каждое слово имеет свою первую букву, сдвинутую в конец, за которой следует «ay». Также предположим, что знаков препинания нет.

Таким образом, "stackoverflow велик" становится "tackoverfloway siay reatgay".

Я попробовал эту программу, и я почти закончил. Он работает нормально, за исключением того, что по какой-то причине у меня каждый раз разрыв строки в середине последнего слова.

Например:

tackoverflowsay siay reat
гей

Вместо:

tackoverflowsay siay reatgay

Я пытался определить, что может вызвать разрыв строки в последней части выхода моей программы, но я этого не вижу. У меня есть преждевременная строка с нулевым символом в конце? Если я это сделаю, я не вижу этого.

Вот мой код:

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

1 Ответ

2 голосов
/ 01 апреля 2009

У вас почти наверняка есть строка вида:

stackoverflow is great\n

, где \n - символ новой строки. Это будет переводить в:

tackoverflowsay siahy reat\ngay

, если вы упростили определение конца слова как пробел или нулевой терминатор.

Я не собираюсь давать вам код (так как это домашнее задание), но, на мой взгляд, самым простым решением было бы сделать еще один цикл обработки всей строки, заменив все символы "\n" пробелами.

Это будет сделано до того, как ваши циклы латинизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...