2014-04-29 46 views
0

你好,我有一个程序,将用户输入的字符串按字母顺序排列,同时也过滤出不是小写字母的字符。我有一个递归循环的alphabetizing程序,然后设置一个更简单的过滤器来清除不是小写字母的字符。我可以让程序正确地按字母顺序排列并过滤掉字符,一旦发生程序询问用户是否想再次尝试。这是我遇到问题的地方,当前面的字符串比后面的字符串长时,剩下的字符被打印出来。当再次运行程序时MIPS输出包括先前的输出

例如,如果第一个字符串alphabetizes为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 

回答

0

它看起来像你的syscall$v0=8不空终止您输入的字符串。也许有一个不同的系统调用会做到这一点。

如果不是,则应在用$v0=8调用syscall之前用0替换input缓冲区。

相关问题