我正在从事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
有什么方法可以在不删除其元素并获得修改后的字符串作为输出的情况下向前移动字符串吗?任何帮助将不胜感激谢谢!
答案 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);