如何在MIPS中修改和打印字符串? [英] How to modify and print a string in MIPS?

查看:26
本文介绍了如何在MIPS中修改和打印字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在MIPS中处理一项任务。我想打印不带小数点的存储字符串,即110.11的输出应该是11011。

我认为我的代码正在做它应该做的事情,但是它没有显示任何输出。我对它进行了调试,结果发现addi语句一直在删除字符串的第一个元素,所以最后什么也没有留下。

.data
        string: .asciiz "110.11"
.text
.globl main
.ent main
main:
     la $t1,string
     li $t5,46              #ascii code of .=46

     LOOP:
     lb $t0,($t1)
     beq $t0,$t5,SKIP       #skip point if found
     beq $t0, $zero, exit 
     sb $t0,($t1)
     addi $t1, $t1, 1       #i++

     j LOOP

     SKIP:
     addi $t1, $t1, 1
     j LOOP

     exit:  
     li $v0,4
     move $a0,$t1
     syscall

     li $v0,10
     syscall
     jr $ra
.end main

有没有办法在不删除其元素并将修改后的字符串作为输出的情况下向前移动字符串?如有任何帮助,我们将不胜感激!

推荐答案

您的代码显然没有做它应该做的事情,因为这样您就不会在这里提出问题。

您的代码主要做的是

while (*string) {
  if (*string != '.')
    *string = *string;
  string++;
}
syscall (string);

因此,您不仅没有删除点,而且还打印了空字符串,或者更准确地说,打印了字符串末尾和处的终止零字节。

您可以说"结果是addi语句一直在删除字符串的第一个元素,所以最后什么都没有留下"。似乎缺乏对该语句的作用以及它与以零结尾的字符串之间的关系的理解。此循环中的addi会将指针前移到字符串的末尾,因为这就是此循环所做的。递增指针意味着指针现在指向第二个字节,因此您可以从下一个字节开始获取字符串。内存本身未修改。

您可以尝试这样的操作。它假设您将汇编器配置为按编写的顺序执行语句,换言之,重新排序语句,以便t1的加法将进入分支之后的槽中。

main:
     la $t1,string
     move $t2,$t1
     move $t3,$t1           # t1 = t2 = t3 = string
     li $t5,46              #ascii code of .=46

LOOP:
     lb $t0,($t1)
     addi $t1, $t1, 1       #t1++
     beq $t0,$t5,SKIP       #skip point if found
     sb $t0,($t2)
     addi $t2, $t2, 1       #t2++
SKIP:
     bneq $t0, $zero, LOOP   # exit on end of string

     li $v0,4
     move $a0,$t3
     syscall

     li $v0,10
     syscall
     jr $ra

在C中,这将是

t1 = t2 = t3 = string;
do {
  t0 = *t1++;
  if (t0 != '.')
    *t2++ = t0;
} while (t0 != 0);
syscall (t3);

这篇关于如何在MIPS中修改和打印字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆