MIPS:在寄存器$ 31中加载单词

时间:2014-09-25 17:35:27

标签: assembly mips

这是我的代码:

jal next

next: lw $t0, 0x20($31)
         .
         .
         .
      sw $t0, 0x20($31)

我不明白这是如何从寄存器31加载字,如果寄存器31是返回地址链接到下一个 jal 被叫了。

究竟是什么加载或保存到寄存器$ t0?

2 个答案:

答案 0 :(得分:1)

$t0加载了来自内存的字,该字在jal指令之后的指令字之后为0x20字节。如果jal位于地址0x80004000,则$t0将加载地址0x80004000 + 0x4 + 0x20 = 0x80004024的内容。

这不是一种有用的编码技术,它可能会使某些MIPS实现程序崩溃,这些MIPS实现实现了只执行 .text段,无法读取或写入。

答案 1 :(得分:1)

寄存器$31可以像lw指令一样用于任何其他通用寄存器。 在这种情况下,$31将在发布的jal之后保留下一条指令的地址。

因此lw $t0, 0x20($31)将在$ t0中加载位于发出jal的下一条指令的地址后32字节的字的内容。

通常,加载的值可以解释为指令,即它将存储在文本段中,如果您修改$t0然后{{1}的内容,则可以用它来执行自修改代码它再次到同一个地址。