我正在尝试了解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。然而,这个偏移是我已经看过并确认为正确的代码块的一半。那么我对那些指令和内存寻址的理解是否有缺陷呢?
答案 0 :(得分:1)
它转换为此代码:
$k1 = &off_9FC005A8; // we load an address here!
$k1 = *($k1 + (&off_9FC005D4 - &0x9FC005A8)); // we do a memory access here
k1首先加载指向常量表开头的地址。这就是la伪指令的作用。它转换为“加载地址”。
然后进行内存访问,将刚刚加载的地址作为基础,并使用两个条目之间的差异作为偏移量。
对数组进行简单的寻址。