【问题标题】:Assembly MIPS: Reverse Printing a string汇编 MIPS:反向打印字符串
【发布时间】:2016-11-07 20:14:49
【问题描述】:

假设我们输入了单词“test”,并且我们希望程序将这个单词反转(“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, '\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,光标一直向右移动。

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

怎么会这样?

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    您的代码有一些问题:

    • reversingloop 应该预先递减 $t0(即在 lb 之前执行 subiu $t0, $t0, 1 之前,而不是之后),否则您首先要读取 NUL 终止符你在readingloop找到了。

    • reversingloop 的退出条件不应该是您找到了 NUL 终止符,因为 NUL 终止符位于字符串的 end 处,而您'向字符串的开头重复(顺便说一句,您在一个地方将'\0' 错误地输入为'0')。退出条件应该是$t0等于0。

    【讨论】:

    • 第一点是对的,我早该知道的。第二个对我来说似乎有点奇怪,因为它通过重新输入 '\0' 来解决我的错误。当 $t0 == str 时,如何使退出条件为真?我不知道“如果相等则分支”派系是否收到“str”变量。
    • 查看我的编辑。我忘记了 $t0 包含偏移量,而不是完整地址。所以你应该在$t0 等于 0 时退出(而不是当你现在正在做的$a0 等于 0 时)。您可能会说它正在“工作”,但在程序结束时查看$t0 的值,您应该会看到您一直在读取数组边界之外的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多