我正在研究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
函数的任何建议,它将为每个用户输入分配一个新空间?
感谢。
答案 0 :(得分:1)
在堆上分配空间。对于系统调用的大多数模拟器9.不是发送静态分配的空间la $a0, input
,而是发送堆分配的地址。