我需要使用用户输入的字符,并使用递归将其插入到右字母位置的字符串中,然后请求另一个字符。一次只能输入一个字符。
我认为一个好方法是扫描字符串,当输入的字符与字母串中的字符匹配时,然后插入它。但我无法将其放入代码中。我也必须使用递归(堆栈,$ 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
答案 0 :(得分:1)
在解决其他问题之前,您需要明确这个插入应该如何工作。你要取一个字符并将其插入一个预先存在的字符串,对吗?如果是这样,那么这意味着你需要创建一个填充了字符串的可修改缓冲区。 .space
指令会这样做。此外,您需要分配一个大缓冲区,因为您将插入字符。最后,插入字符意味着转移,所以为此做好准备。
目前,您有:
str: .asciiz "abcdefghijklmnopqrstuvwxyz"
我猜你要修改那个字符串,但字符串声明不是要修改的。你可能可以修改它甚至让你的程序工作,但我不建议那样做。如果你声明多个字符串(并且你这样做),它们可能会被连续放置,然后你就会覆盖数据。在尝试询问用户输入之前,我会专注于解决所有问题。
然后你有以下内容:
loop:
li $v0,8
syscall
move $t0,$v0
syscall 8
读取字符串,而不是字符。 syscall 12
读取一个字符。在尝试从控制台读取字符串时,您没有在$a0
中提供缓冲区地址。然后,您尝试将系统调用的结果移动到临时寄存器中,但该调用不会返回任何内容。它只将输入字符串放入缓冲区。