如何为read_string分配空间

时间:2012-05-18 10:41:35

标签: assembly mips

我正在研究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只是一个引用,因此,调用ReadLine后,将更改s指向的值。当然,我希望变量保留自己的用户输入副本。

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

感谢。

1 个答案:

答案 0 :(得分:1)

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