2012-04-18 49 views
1

我需要输入一个用户输入的字符,并使用递归将它插入正确字母位置的字符串中,然后请求另一个字符。一次只能输入一个字符。使用递归插入字符到字符串? (MIPS)

我认为一个好方法是扫描字符串,当输入的字符匹配字母串中的字符时,然后插入它。但是我很难将其转化为代码。我也必须使用递归(堆栈,$ jal,$ jr $ ra),但我并不完全熟悉如何使用它。

这是到目前为止我的代码:

 .data 

    str: .asciiz "abcdefghijklmnopqrstuvwxyz .space 30" 
    input: .asciiz "Please input a letter: " 
    error1: .asciiz "Error! Please only enter one lowercase letter!" 
    print1: .asciiz "The string is: " 


    .text 

    main: 
    la $s0,0 
    li $v0,4 
    la $a0,input 
    syscall 

    loop: 
    li $v0,8 
    syscall 
    move $t0,$v0 
    blt $t0,61,error #if less than a 
    bgt $t0,80,error #if more than z 
    bge $t0,0x50,print #when user enters P, print 

    loop2: 
    lb $t2,str($s0) #load first byte of string 
    bge $t0,$t2,store #if input char=string char, store it 
    addi $s0,$s0,1 #next char in string 
    j loop 

    store: 
    sw $t0,str($s0) #store char in string 
    addi $s0,$s0,1 #next char in string 
    j loop 

    error: 
    li $v0,4 
    la $a0,error1 #print error message 
    syscall 
    j loop #jump back to loop 

    print: 
    li $v0,4 
    la $a0,print1 #print dialogue 
    syscall 
    li $v0,4 
    la $a0,str #print string 
    syscall 

回答

1

之前别的解决任何事情,你需要明确这个插入应该究竟如何工作。你需要一个字符并将其插入一个预先存在的字符串中,是否正确?如果是这样,那么这意味着你需要创建一个可修改的缓冲区来填充字符串。 .space指令将做。此外,你需要分配一个大的缓冲区,因为你会插入字符。最后,插入字符意味着转移,所以要为此做好准备。

目前,您有:

str: .asciiz "abcdefghijklmnopqrstuvwxyz" 

我猜你要修改字符串,但并不意味着字符串声明进行修改。你可能会修改它,甚至让你的程序工作,但我不建议这样做。如果你声明了多个字符串(并且你这样做),它很可能会被连续放置,然后你会覆盖数据。在尝试询问用户输入之前,我会专注于解决所有问题。

然后你具备以下条件:

loop: 
    li $v0,8 
    syscall 
    move $t0,$v0 

syscall 8读取一个字符串,而不是一个字符。 syscall 12读取一个字符。在尝试从控制台读取字符串时,您没有在$a0中提供缓冲区地址。然后,您尝试将系统调用的结果移入临时寄存器,但该调用不返回任何内容。它只将输入字符串放入缓冲区。