2010-11-04 69 views
3

如何在使用多個陣列時在程序集中分配內存。例如,我有2個數組;裝配多個陣列內存分配

la $s0, X 
la $s1, Y 

如果爲「初始化」是這樣,存儲器分配是連續的,例如

Address  +0  +4  +8  +12  ..... 
22112  x[0]  y[0]  x[1]  y[1] ... 
. 
. 
. 

爲了「修復」的是,我認爲加載拳頭陣列地址初始化n值的然後從那裏初始化另一個。例如

arrayAllocationX: 
    la $t0, X 
    fill with $zero until n-1($t0) 
    la $s0, X 

arrayAllocationY: 
    la $t1, Y 
     fill with $zero until n-1($t1) 
    la $s1, Y 

說明la $s0, Xla $s1, Y繼續存儲值連續時,這沒有工作,因爲它。例如:

我雖然有其他的方法可以做到這一點,在連續填充項目和讀取陣列跳轉1內存地址的值時,x [0] =地址2234 - > x [1] = 2234 + 8。但是這看起來不太好的編程習慣。

你能否告訴我哪種方法是正確的?謝謝!


順便說一句,值總是往裏面的順序讀取(第一則X×Y)

回答

2

我希望我沒有誤解你的問題,但對於一個數組分配內存通常是通過做一個特殊的彙編指令,而不是通過特定的指令。不幸的是,語法有所不同,但總體思路是要求彙編程序分配一些空間。假設X陣列需要100個整數和Y陣列200下面是一些組裝機如何做到這一點:

X: defs 100*4 
Y: defs 200*4 

其他人可能會說「.BYTE」而不是‘DEFS’。 「* 4」是因爲您以字節爲單位分配空間,但每個int都是4個字節。有時候,組裝者有一種方式來說「分配空間並填充一些價值」。我在這裏介紹的內容不會這樣做,以確保您現在需要寫入初始值。讓我們充滿1和Y X 2的:

 la $t0,X   ; get address of X array into $t0 
    mov $t1,100  ; number of items in X into $t1 
    mov $s0,1   ; All X[] to be filled with 1 
xlp: st $s0,0($t0) ; write next X[] value 
    add $t0,$t0,4  ; move to next position in X[] array 
    add $t1,$t1,-1 ; count down one less item 
    bne $t1,0,xlp  ; keep doing this until we get to zero 

    la $t0,Y 
    mov $t1,200 
    mov $s0,2 
ylp: st $s0,0($t0) 
    add $t0,$t0,4 
    add $t1,$t1,-1 
    bne $t1,0,ylp 

的意見是有點多餘,但我想再次重申我在,我已經忘記了我的MIPS彙編助記符或做出可能的事件正在做一個失誤。

動態分配數組是一個完全不同的命題。通常你會調用一個操作系統子程序來獲取指向特定大小內存塊的指針。如果你真的處於低水平,你將不得不提出自己的計劃。有趣的是,這本身就是一個聲明一個靜態數組的問題,該數組涵蓋了所有可用內存,然後在程序請求時將這些內存塊分離。然後,你必須很難跟蹤你已經交出的東西,所以你可以釋放大塊。

無論哪種情況,您都會得到一個指向所請求的內存量的指針。通常情況下,您需要將該指針保存在內存位置,但它可以位於一個簡單程序的寄存器中。分配代碼可能如下所示:

X:  word 0 

mov $t0,100*8 ; how much memory we will need 
bal alloc  ; get memory -- assume it returns pointer in $t1 
la  $s0,X  ; X pointer address 
st  $t1,0($s0) ; keep track of start of array 

請注意,我們必須分兩步來獲取數組地址。在「X」之前是要使用的內存的地址。現在「X」是包含數組地址的4個字節的存儲器的地址。

前面的初始化代碼將像以前一樣工作,但不是一個簡單的「拉$ T0,X」你必須:

la $t0,X 
l $t0,0($t0) 

如果你熟悉C,所不同的是這裏與「int X [100]」相同;「與「int * X = malloc(100 * sizeof(int));」。在這兩種情況下,您都可以說「X [n]」,但幕後C使用正確的彙編程序序列。

+0

偉大的答案喬治和感謝,因爲如此詳細。然而,當我需要在兩個陣列中同時引入項目時,我的問題就出現了。例如你的名字在x [0]中,你的手機在y [0]中。另外我認爲不能使用「defs/.space」,因爲數組的大小在執行前是未知的。這是不好的做法,就像我說的「連續填充項目並讀取數組跳轉1內存地址的值x [0] =地址2234 - > y [0] = 2234 + 4」? – Carlos 2010-11-04 03:52:31

+0

名稱使事情變得複雜,因爲它們往往是可變寬度。但是你所建議的對於固定大小的值是很好的。它更多的是在每個位置都有兩個相關數據的單個數組。用C語言來說,是一系列結構。如果寄存器$ t0指向數組中的一個項目,「l $ s0,0($ t0)」可能會獲得工資,「l $ s0,4($ t0)」可能獲得該年齡。移動到下一個數組元素意味着將8添加到$ t0。動態內存分配是另一回事。我會更新我的答案。 – 2010-11-04 04:43:24

+0

令人驚歎的答案!謝謝喬治! – Carlos 2010-11-04 05:20:44