2012-05-18 24 views
1

我正在開發Decaf編程項目,這是一個發出Mips程序集的編譯器。這是用於從標準輸入中讀取字符串的內置函數ReadLine的程序集。如何爲read_string分配空間

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 

所以,我可以因爲所有的用戶輸入被讀入相同的地址和s只是一個參考,但是,下面的調用結果(實際上是一個參考)分配給一個字符串

string s = ReadLine(); 

ReadLine將改變s指出的值。當然,我希望變量保留自己的用戶輸入副本。

我從來沒有做過Mips彙編代碼之前坦率地說,大多數上面的代碼不是我的。我有一本手冊,有關如何實現ReadLine函數的任何建議,該函數將爲每個用戶輸入分配一個新空間。

謝謝。

回答

1

在堆上分配空間。對於大多數系統調用的模擬器來說,不是發送靜態分配的空間la $a0, input,而是發送堆分配的地址。

+0

是的,釘了它!謝謝! – manuzhang