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

看起来带有$v0=8syscall不会为null终止输入字符串。也许有一个不同的系统调用可以做到这一点。

如果没有,那么在用$v0=8调用syscall之前,应该用零覆盖input缓冲区。

最新更新