让我们说我们输入单词" test"并且我们希望程序返回作为输出这个单词反转(" tset")。
使用C,典型的for循环可以很容易地完成这项工作。
for(i='/0'; i>=0; i--)
printf("%c", str[i]);
但是在MIPS,至少事情变得非常混乱。
尝试通过制作两个循环来使其工作。一个用于简单地读取字符串的每个字符,另一个用于反向打印它们:
.data
str: .space 15
.text
.globl main
main:
li $v0, 8 #scan a string
la $a0, str
la $a1, 15
syscall
add $t0, $zero, $zero #counter
readingloop:
lb $a0, str($t0) #read each character
beq $a0, '\0', readingexit #make sure the string is not yet over
addiu $t0, $t0, 1 #i++
j readingloop
readingexit:
reversingloop:
li $v0, 11 #print a character you have read
lb $a0, str($t0)
syscall
beq $a0, '0', reversingexit #make sure the string
#hasn't reached the first letter yet
subiu $t0, $t0, 1 #i--
j reversingloop
reversingexit:
li $v0, 10
syscall
它工作得很好。
有点儿。因为在MARS,光标一直向右运行。
似乎反转循环需要检查计数器何时在" i> = 0"我们上面说过的for循环的东西。
这怎么可能发生?
答案 0 :(得分:0)
您的代码存在一些问题:
reversingloop
应该预递减$t0
(即subiu $t0, $t0, 1
之前<{1}},而不是之后),否则你首先阅读您在lb
中找到的NUL终止符。
readingloop
的退出条件不应该是您找到了NUL终止符,因为NUL终结符位于字符串的 end ,并且你正在向字符串的开头进行迭代(顺便说一句,你在一个地方错误地将reversingloop
错误地称为'\0'
)。退出条件应该是'0'
等于0.