1

我正在开发 Decaf 编程项目,这是一个发出 Mips 程序集的编译器。ReadLine这是从标准输入读取字符串的内置函数的程序集。

 input:
      .space 40
 _ReadLine:
    subu $sp, $sp, 8
    sw $fp, 8($sp)
    sw $ra, 4($sp)
    addiu $fp, $sp, 8
    subu $sp, $sp, 4
    li $a1, 40
    la $a0, input
    li $v0, 8              #read_string syscall
    syscall
    la $t1, input
bloop4:
    lb $t5, ($t1)
    beqz $t5, eloop4
    addi $t1, 1
    b bloop4
eloop4:
    addi $t1, -1
    li $t6, 0
    sb $t6, ($t1)
    la $v0, input
    move $sp, $fp
    lw $ra, -4($fp)
    lw $fp, 0($fp)
    jr $ra

所以我可以将结果(实际上是一个引用)分配给一个字符串

 string s = ReadLine();

由于所有用户输入都被读入相同的地址并且s只是一个参考,但是,调用 ofReadLine将更改 指向的值s。当然,我希望变量保留自己的用户输入副本。

我以前从未做过 Mips 汇编编码,坦率地说,上面的大部分代码都不是我的。我有一本手册,所以关于如何实现ReadLine为每个用户输入分配新空间的功能有什么建议吗?

谢谢。

4

1 回答 1

1

在堆上分配空间。对于大多数模拟器,系统调用 9。不是发送静态分配的空间,而是发送la $a0, input堆分配的地址。

于 2012-05-18T23:39:52.107 回答