Вывод MIPS включает предыдущий вывод при повторном запуске программы

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

Например, если первая строка расположена в алфавитном порядке до abcdefgxyz, а вторая должна быть только abcdefg, на выходе все равно будет отображаться xyz.

Любая помощь будет оценена!

Вот мой код

        .text
main:   la $a0, prompt    
        li $v0, 4
        syscall

        la $a0, input   
        li $a1, 21      
        li $v0, 8
        syscall

        la $t0, input
        la $t7, input
        la $t5, final

loop:   lb $t1, 0($t0)          
        lb $t2, 1($t0)
        ble $t1, $t2, incr
        beqz $t2, filter
        jal swap        
        j loop          

incr:   addi $t0, $t0, 1
        j loop

filter: lb $t3, 0($a0)
        blt $t3, 0x61, next
        bgt $t3, 0x7a, next
        sb $t3, 0($t5)
        add $t5, $t5, 1

next:   beqz $t3, output
        addi $a0, $a0, 1
        j filter

output: la $a0, display
        li $v0, 4
        syscall
        la $a0, final
        syscall
        la $a0, again
        syscall
        li $v0, 12
        syscall

        beq $v0, 0x79, clr
        j end

clr:    li $a0, 0x0a
        li $v0, 11
        syscall
        j main

end:    la $a0, termin
        li $v0, 4
        syscall
        li $v0, 10       
        syscall

swap:   sub $sp, $sp, 4         
        sw $ra, ($sp)           
        sb $t1, 1($t0)          
        sb $t2, 0($t0)
        beq $t0, $t5, return    
        sub $t0, $t0, 1         
        lb $t1, 0($t0)          
        lb $t2, 1($t0)
        ble $t1, $t2, return    
        jal swap        

return: addi $t0, $t0, 1        
        lw $ra, ($sp)
        addi $sp, $sp, 4
        jr $ra


        .data
prompt: .asciiz "Please enter a string to alphabetize and filter: "
display:.asciiz "\nThe alphabetized and filtered string is: "
again:  .asciiz "\nDo you want to try again (y for yes)? "
termin: .asciiz "\nProgram terminated."
input:  .space 21
final:  .space 21

person user3583327    schedule 29.04.2014    source источник


Ответы (1)


Похоже, что ваш syscall с $v0=8 не завершает строку ввода нулем. Возможно, это сделает другой системный вызов.

Если нет, то вы должны перезаписать буфер input нулями, прежде чем вызывать syscall с помощью $v0=8.

person Mark Lakata    schedule 29.04.2014