装配MIPS:反向打印字符串

时间:2016-11-07 20:14:49

标签: assembly mips

让我们说我们输入单词" 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,光标一直向右运行。

enter image description here

似乎反转循环需要检查计数器何时在" i> = 0"我们上面说过的for循环的东西。

这怎么可能发生?

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  • reversingloop应该预递减$t0(即subiu $t0, $t0, 1 之前<{1}},而不是之后),否则你首先阅读您在lb中找到的NUL终止符。

  • readingloop的退出条件不应该是您找到了NUL终止符,因为NUL终结符位于字符串的 end ,并且你正在向字符串的开头进行迭代(顺便说一句,你在一个地方错误地将reversingloop错误地称为'\0')。退出条件应该是'0'等于0.