[英]MIPS: loading word in register $31
这是我的代码:
jal next
next: lw $t0, 0x20($31)
.
.
.
sw $t0, 0x20($31)
我不明白这是如何从寄存器31加载字的,如果寄存器31是在调用jal时链接到下一个的返回地址 。
究竟将什么装入或保存到寄存器$ t0中?
$t0
装载了jal
指令后指令字后0x20字节的内存字。 如果jal
位于地址0x80004000,则$t0
将加载地址0x80004000 + 0x4 + 0x20 = 0x80004024的内容。
这不是一种有用的编码技术,它可能会使您的程序在某些MIPS实现上崩溃,这些MIPS实现实现只能执行的 .text段,这些段无法读取或写入。
寄存器$31
可以在lw
指令中使用,就像其他通用寄存器一样。 在这种情况下, $31
将保留发出jal
之后的下一条指令的地址。
因此, lw $t0, 0x20($31)
将在下一个发出jal
指令的地址后32个字节处装入$ t0中的字内容。
通常情况下,装载值可以解释为一个指令,也就是说,它会被存储在文本段和可用于执行自修改代码,如果你修改的内容$t0
,然后sw
再次它相同的地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.