MIPS-32链接器如何转换LW和SW地址?

时间:2019-09-11 19:22:43

标签: assembly linker hex mips mips32

我正在阅读Computer Organization and Design的2.12章,试图了解MIPS-32链接器的逻辑。我了解链接两个目标文件和绝对引用链接的概念。我不理解的是下面引用的段落,解释了计算绝对地址的逻辑。

  

由于相对于基址,加载和存储地址更难   寄存器。本示例使用全局指针作为基址寄存器。图2.13   显示$ gp初始化为1000 8000 hex 。要获得地址1000 0000 hex (单词X的地址),我们将8000 hex 放在lw的地址字段中的地址40 0000 hex >。同样,将8020 hex 放在sw的地址字段中的地址40 0100 hex 上,以获得地址1000 0020 hex (单词的地址)是)。
  页面128

根据指令lwsw的MIPS-32指令集,立即偏移量操作数被添加到寄存器操作数。

但是
1000 8000 hex + 8000 hex = 1001 0000 hex != 1000 0000 hex
1000 8000 hex + 8020 hex = 1001 0020 hex != 1000 0020 hex

因此,也许我误会了某些东西,并且减去了偏移量?即使是这样:

1000 8000 hex -8000 hex = 1000 0000 hex == 1000 0000 hex
1000 8000 hex -8020 hex = FFFF FE0 hex != 1000 0020 hex

这是怎么回事?

图2.13:

MIPS-32 Memory Allocation

1 个答案:

答案 0 :(得分:1)

在将指令字中找到的16位偏移量加到基地址之前,先对其进行符号扩展至32位。

因此,如果指令字中的偏移量为0x8000,则将得到0x10008000 + 0xFFFF8000 == 0x10000000(当结果被截断为32位时)。第二个示例也是如此。