这是我的代码:
jal next
next: lw $t0, 0x20($31)
.
.
.
sw $t0, 0x20($31)
我不明白这是如何从寄存器31加载字,如果寄存器31是返回地址链接到下一个 jal 被叫了。
究竟是什么加载或保存到寄存器$ t0?
答案 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}的内容,则可以用它来执行自修改代码它再次到同一个地址。