2013-04-27 62 views
0

我正在學習使用MIPS和MARS模擬器的彙編語言的基礎。 標題包含我的問題,但我會試着用一個例子來擴展它。 假設我們想從鍵盤讀取一個字符串(最多200個字符)。我們要繼續的方式來自輸入的字符串,它們應該存儲在哪裏,動態還是靜態數據?

1)我們分配的靜態數據分段201個字節,執行系統調用來讀字符串,然後通過「串」地址

.data 
string:  .space 201 

.text 
li $v0, 8 
la $a0, string 
li $a1, 201 
syscall 

2)我們把它請求由sbrk函數(唯一可用於MARS)堆上的201個連續字節,然後我們用輸入字符串填充它們。

li $v0, 9 
la $a0, 201 
syscall 
move $s0, $v0 

li $v0, 8 
move $a0, $s0 
li $a1, 201 
syscall 

這兩種方法的優缺點是什麼?我總是在MIPS例子中看到第一種方法,但我無法理解第二個未使用的wya。

感謝提前:)

+0

示例不使用第二種方法只是簡單地保持示例。真正的程序可能會使用任何一種方法 – markgz 2013-04-30 02:07:46

回答

1

第一種方法是在一個簡單的程序,只需要緩衝器的固定的(小的)數目的罰款。而且沒有必要釋放內存,這對初學者來說更簡單。

動態分配方法爲您的流程的內存使用提供了更大的靈活性。
例如,您可能只有一個暫時需要的緩衝區,並且由於內存是有限資源,因此您可能需要動態分配該內存,以便在不再需要時釋放該內存 - 而不是靜態分配內存將保持分配給您的流程的整個生命週期。
也有可能你不知道你在編譯時需要多少內存,因爲它可能取決於在一些用戶輸入上。這是動態內存分配很有用的另一種情況。

動態分配內存的缺點是你(程序員)必須跟蹤所有的分配情況。也就是說,你必須確保你在某個時候釋放了你已經分配的內存,但是在釋放之前你還需要確保你的程序已經完成了這段內存的存儲(或者你最終可以搖晃指針)。

相關問題