2017-01-10 108 views
0

我想編寫一個以字符串作爲參數(來自用戶輸入)並存儲在動態內存中的子例程。MIPS:如何在動態內存(堆)中存儲字符串

這是我想出了:

.data 
    name: .space 32 # allocates 32 bytes of memory to store a name 

    namePrompt: .asciiz "name: " 

    .text 
    .globl main 

main: 

    la $a0, namePrompt 
    li $v0, 4 # system call to print a string. 
    syscall # print namePrompt. 

    la $a0, name # adress where to store the input 
    li $a1, 32 # max input size in bytes 
    li $v0, 8 
    syscall 

    la $a0, name # name as first parameter of save_string subroutine 
    jal save_string 



save_string: 

    move $s0, $a0 # s0 = name. 

    # allocate 32 bytes in heap memory. 
    li $v0, 9 
    li $a0, 32 
    syscall 

    sw $s0, 0($v0) # store the name in allocated memory 

    jr $ra 

但是我有一種感覺,這是不這樣做的正確方法。

此外,如何釋放空間?

回答

1

但我有一種感覺,這不是正確的做法。

不,您目前只是將字符串的地址存儲在堆分配的內存中。如果你想存儲的內容,你需要一個循環:

move $s1,$v0 
copy: 
    lb $t0,($s0)  # Read one byte from the source address 
    sb $t0,($s1)  # Store it at the destination address 
    addiu $s0,$s0,1 
    addiu $s1,$s1,1 
    bne $t0,$zero,copy # Repeat until the NUL terminator has been copied 

而且我怎麼釋放空間後?

假設模擬器的sbrk調用主機操作系統的sbrk你可以傳遞一個負值sbrk縮小你的程序的堆。

相關問題