2012-04-21 252 views
1

想象一下,我有一個C中有5個參數的函數。MIPS從寄存器獲取內存地址

sum(n1,n2,n3,n4,n5); 

正在裝配中。我從寄存器4的前四個參數7,最後一個參數是加入這樣的:

lw $8, 16($29) 

第一個問題

如果lw $8, 16($29)卻將N5在寄存器$ 8,爲什麼沒有這個

lw  $9, 0($29) 
lw  $10, 4($29) 
lw  $11, 8($29) 
lw  $12, 12($29) 

將n1到n4放入寄存器$ 9到$ 12?

第二個問題

由於sum(n1,n2,n3,n4,n5);的參數某處存儲在內存中,並在組裝時,第一個參數是$4我怎麼能得到的$4$7的內存地址?

如果我這樣做:

.data 
array: .word 3,4,2,6,12,7,18,26,2,14,19,7,8,12,13 
    .text 
main: 
    li $8,1 
    la $9,array 

的最後一條指令放入$9我數組的地址位置。如果我做

main: 
    li $4,1 
    la $9,0($4) 

$9值仍爲1和$4

+0

有關MIPS調用約定的更多信息,請參閱http://stackoverflow.com/q/10214334/583570。 – markgz 2012-04-23 18:15:44

回答

3

第一個問題不是地址

要回答這個問題,你需要了解的參數傳遞是如何通常處理。參數傳遞有conventions。前四個參數始終通過寄存器$ 4到$ 7,並且剩餘的參數通過堆棧傳遞。如果堆棧中的前四個參數已經通過寄存器傳遞,沒有意義,對吧?所以它只是在前四名之後剩下的東西。

第二個問題

registers和內存之間的區別。 CPU寄存器沒有映射到任何內存地址。它們是獨立於RAM,ROM等其他內存的特殊「碎片」。它們比RAM或ROM中的內存快得多,因此有MIPS指令直接在其上運行,而不是間接通過內存地址。

想想究竟你在做什麼:

main: 
    li $4,1 
    la $9,0($4) 

什麼是第一條指令在做什麼?它將值1加載到寄存器4中。

第二條指令在做什麼?它的治療寄存器4內的值作爲標籤(或地址),將0加至它,並且將結果存儲在寄存器9中。因此,當然寄存器9將最終具有1

的值在MIPS和幾乎所有架構中,都沒有尋址寄存器的概念。您直接操作就可以了。

編輯:我應該區分processor registershardware registers。當然,我指的是處理器寄存器。硬件寄存器(在CPU之外)是一個略有不同的概念,他們明確地尋址。但是,我認爲這超出了法沃拉斯所要求的範圍。

+0

非常感謝您的有益解釋 – Favolas 2012-04-21 19:50:39