2010-11-24 27 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