如何在MIPS中修改和打印字符串?

时间:2019-06-13 16:31:42

标签: string assembly 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

有什么方法可以在不删除其元素并获得修改后的字符串作为输出的情况下向前移动字符串吗?任何帮助将不胜感激谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码显然没有按照预期的那样做,因为那样您就不会在这里提出问题了。

您的代码基本上是做什么的

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

因此,您不仅要删除点,而且还要打印空字符串,或更准确地说,是在字符串and处终止零字节。

您说“事实证明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);