我正在尝试编写一个程序来获取用户字符串输入并在MIPS中反转该字符串。 但是,我必须做一些可怕的错误,因为它不仅反向显示用户输入,而且还会向用户反转提示。似乎用户输入最终没有用null(零?)字符标识。
.data
prompt: .asciiz "Please enter your name. You're only permitted 20 characters. \n"
userInput: .space 20 #user is permitted to enter 20 characters
.globl main
.text
main:
# user prompt
li $v0, 4
la $a0, prompt
syscall
# getting the name of the user
li $v0, 8
la $a0, userInput
li $a1, 20
syscall
add $t0, $a0, $0 # loading t0 with address of array
strLength:
lbu $t2, 0($t0)
beq $t2, $zero, Exit # if reach the end of array, Exit
addiu $t0, $t0, 1 # add 1 to count the length
j strLength
Exit:
add $t1, $t0, $0 # t1 = string length
li $t2, 0 # counter i = 0
li $v0, 11
reverseString:
slt $t3, $t2, $t1 # if i < stringlength
beq $t3, $0, Exit2 # if t3 reaches he end of the array
addi $t0, $t0, -1 # decrement the array
lbu $a0, 0($t0) # load the array from the end
syscall
j reverseString
Exit2:
li $v0, 10
syscall
答案 0 :(得分:1)
问题1:
add $t1, $t0, $0 #t1 = string length
您在$t1
分配的内容不是字符串的长度;它是地址超过字符串结尾的第一个字节。
问题2是你永远不会在$t2
循环中增加$t1
(或递减reverseString
)。
我建议你使用SPIM / MARS中的调试功能(比如设置断点和单步执行代码的能力),因为这样就可以很容易地找到这些问题。