【问题标题】:How to modify and print a string in MIPS?如何在 MIPS 中修改和打印字符串?
【发布时间】:2019-06-13 16:31:42
【问题描述】:

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

我认为我的代码正在做它应该做的事情,但它没有显示任何输出。我调试了它,结果发现 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

有没有办法在不删除其元素并将修改后的字符串作为输出的情况下在字符串中前进?任何帮助将不胜感激谢谢!

【问题讨论】:

    标签: string assembly mips


    【解决方案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);
    

    【讨论】:

    • 很好解释的答案;很好地解决了对循环字符串字节意味着什么的误解。顺便说一句,MARS 和 SPIM 模拟没有分支延迟槽的 MIPS(有一个菜单选项);这就是为什么您通常会在 SO 上看到假设没有分支延迟槽的 MIPS 问题。如果他们只是学习 asm 的基础知识,我假设许多学生并没有意识到这个概念,而且他们的教授在他们开始谈论计算机架构和流水线 CPU 的工作原理之前并没有给他们带来复杂的负担。
    • 非常感谢您消除了我的误解。该代码现在运行良好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多