2011-03-09 86 views
5

我想問一下內存訪問。當我執行load word命令時,存在什麼內存限制?這意味着我可以用作偏移量或基址寄存器的最大數量是多少?MIPS內存限制?

寄存器是32位,據我所知「立即」是16位。 因此,我敢肯定,我不能這樣做

array: .word 0:20000 
~ 

la  $s0, array 
lw  $s1, 15000($s0) 
... 

所以,如果我想訪問15000,我可能需要la更小的東西,並從那裏向右走呢? 但是,爲了保持良好狀態,我需要訪問哪些較小的值?爲什麼?

回答

2

lw的直接字段是16位,是的;並且它是二進制補碼,因此立即偏移的可能範圍是-32768..32767 - 所以lw $s1, 15000($s0)應該沒問題。

認識到la不是真正的MIPS指令。相反,它指示彙編程序生成最優化的指令序列,以便將您指定的立即值放入指定的寄存器中。因此,可以使用la來設置全32位值的範圍,但是通常可以通過使用la一次將合適的值放入某個寄存器來產生更優化的代碼,使得幾個後續指令能夠使用來自該值的立即偏移每次需要立即值時使用la

所以,假如你需要加載從偏移量40000和您的陣列的50000值,你可以這樣做:

array: .word 0:20000 
~ 
la  $s0, array   # get address of array 
la  $s1, 40000   # get offset into a register 
add $s0, $s0, $s1  # add offset to address, i.e. calculate (array+40000) 
lw  $s1, 0($s0)   # fetch data from (array+40000) 
lw  $s2, 10000($s0)  # fetch data from (array+40000+10000) 
+0

所以,如果我想和偏移大於32767訪問值,那麼我就需要到'la'在32767並使用另一個偏移量?因爲在我的例子中,我確實使用了一個合適的值(數組的第一個字),但在這種情況下,我說我必須使用另一個'la'或有另一種方式? – Elias 2011-03-09 09:20:03

+0

如果要訪問偏移量不適合直接偏移量字段的值,那麼您需要將偏移量存入寄存器並將其添加到地址中。 'la'會給你一個獲得隨機值的最優方法。如果你一次完成這個操作,只需使用'la'作爲你想要的偏移量,並在'lw'的偏移量字段中使用'0'。如果您訪問多個附近的事物,則執行'la'並添加一次,然後使用相應的立即偏移進行訪問。 – moonshadow 2011-03-09 09:28:11