汇编 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。
假设我们输入单词 "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。