汇编 MIPS:反向打印字符串

Assembly MIPS: Reverse Printing a string

假设我们输入单词 "test" 并且我们希望程序将 return 作为输出这个单词反转 ("tset").

使用 C,一个典型的 for 循环可以很容易地完成这项工作。

for(i='/0'; i>=0; i--)
printf("%c", str[i]);

但在 MIPS,事情至少变得相当混乱。

At 试图通过制作两个循环来使其工作。一个用于简单地读取字符串的每个字符,另一个用于反向打印它们:

.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, '[=11=]', 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,光标一直向右 运行。

似乎反向循环需要检查计数器何时在我们上面所说的 for 循环的 "i>=0" 处成功为零。

怎么会这样?

您的代码有一些问题:

  • reversingloop 应预先递减 $t0(即在 lb 之前执行 subiu $t0, $t0, 1 ,而不是之后),否则您首先要阅读在 readingloop.

  • 中找到的 NUL 终止符
  • reversingloop的退出条件不应该是你找到了一个 NUL 终止符,因为 NUL 终止符位于 end,然后您将迭代到字符串的 beginning(顺便说一句,您在一个地方将 '[=16=]' 错误输入为 '0')。退出条件应该是 $t0 等于 0。