我希望我沒有誤解你的問題,但對於一個數組分配內存通常是通過做一個特殊的彙編指令,而不是通過特定的指令。不幸的是,語法有所不同,但總體思路是要求彙編程序分配一些空間。假設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使用正確的彙編程序序列。
偉大的答案喬治和感謝,因爲如此詳細。然而,當我需要在兩個陣列中同時引入項目時,我的問題就出現了。例如你的名字在x [0]中,你的手機在y [0]中。另外我認爲不能使用「defs/.space」,因爲數組的大小在執行前是未知的。這是不好的做法,就像我說的「連續填充項目並讀取數組跳轉1內存地址的值x [0] =地址2234 - > y [0] = 2234 + 4」? – Carlos 2010-11-04 03:52:31
名稱使事情變得複雜,因爲它們往往是可變寬度。但是你所建議的對於固定大小的值是很好的。它更多的是在每個位置都有兩個相關數據的單個數組。用C語言來說,是一系列結構。如果寄存器$ t0指向數組中的一個項目,「l $ s0,0($ t0)」可能會獲得工資,「l $ s0,4($ t0)」可能獲得該年齡。移動到下一個數組元素意味着將8添加到$ t0。動態內存分配是另一回事。我會更新我的答案。 – 2010-11-04 04:43:24
令人驚歎的答案!謝謝喬治! – Carlos 2010-11-04 05:20:44