2010-11-24 32 views
0

我想了解MIPS的應用程序,但我有點困惑於以下說明:需要在MIPS內存澄清解決LW

la  $k1, off_9FC005A8 
lw  $k1, (off_9FC005D4 - 0x9FC005A8)($k1) 
jr  $k1 

在我的理解,這將等同於以下僞C代碼:

$k1 = *off_9FC005A8; 
$k1 = *($k1 + (*off_9FC005D4 - 0x9FC005A8)); 

因此,瞭解以下內容:

off_9FC005A8: .word 0x9FC01508 
off_9FC005D4: .word 0x9FC011B4 

你會得到:

$k1 = 0x9FC01508; 
$k1 = *($k1 + (0x9FC011B4 - 0x9FC005A8)); 

離開:$ k1 = 0x9FC02114。然而,這個抵消是我已經查看並確認是正確的一段代碼的一半。那麼,我對這些指令和內存尋址是否有缺陷的理解?

回答

1

它翻譯成這樣的代碼:

$k1 = &off_9FC005A8;       // we load an address here! 
$k1 = *($k1 + (&off_9FC005D4 - &0x9FC005A8)); // we do a memory access here 

K1首先被加載與指向常量的表的起始地址。這就是la僞指令所做的。它轉換爲「加載地址」。

然後,存儲器訪問是由它接受剛剛加載地址作爲鹼,並使用兩個條目作爲偏移之間的差別。

它是簡單的尋址到一個數組。

+0

好吧,但是,這還沒有給我帶$ 0x包含0x9FC02114?這似乎不是一個有效的地方跳轉到。 – PeterBelm 2010-11-24 10:45:48