String 如何在MIPS中修改和打印字符串?
我在MIPS做作业。我想打印不带小数点的存储字符串,即110.11的输出应为11011 我认为我的代码正在做它应该做的,但是它没有显示任何输出。我调试了它,结果发现addi语句只是不断删除字符串的第一个元素,所以最后什么都没有留下String 如何在MIPS中修改和打印字符串?,string,assembly,mips,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
.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);
很好的解释了答案;很好地解决了对循环字符串字节意味着什么的误解。顺便说一句,MARS和SPIM模拟没有分支延迟槽的MIPS(有一个菜单选项);这就是为什么您通常会在上看到MIPS问题,从而假定没有分支延迟插槽。我想如果很多学生只是学习asm的基础知识,他们就不会意识到这个概念,而他们的教授在他们开始谈论计算机体系结构和流水线CPU如何工作之前,并没有给他们带来这种复杂的负担。非常感谢你澄清了我的误解。代码现在运行得非常好!