需要澄清lw中的MIPS内存寻址

时间:2010-11-24 09:51:08

标签: assembly mips disassembly

我正在尝试了解MIPS应用程序,但我对以下说明感到有些困惑:

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 个答案:

答案 0 :(得分:1)

它转换为此代码:

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

k1首先加载指向常量表开头的地址。这就是la伪指令的作用。它转换为“加载地址”。

然后进行内存访问,将刚刚加载的地址作为基础,并使用两个条目之间的差异作为偏移量。

对数组进行简单的寻址。