我是这样理解这个故事的:
- PC寄存器保存指向下一条指令的指针
- LDR指令正在将第二个操作数的值加载到第一个操作数中
(例如)
LDR r0, [pc, 0x5678]
相当于这个“C代码”
r0 = *(pc + 0x5678)
它是带有基址偏移量的指针解引用。
我的问题是:
我找到了这段代码
LDR PC, [PC,-4]
它的评论就像猴子补丁等等。
我如何理解这段代码
pc = *(pc - 4)
在这种情况下,“pc”寄存器将取消引用前一条指令的地址,并将包含指令的“机器代码”(不是指令的地址),
并且程序将跳转到该无效地址继续执行,并且可能我们会得到“分段错误”。
那么我缺少或不理解什么?
让我思考的是LDR指令中第二个操作数的括号。
据我所知,在 x86 架构上括号已经取消引用指针,但我无法理解 ARM 架构中的含义。
mov r1, 0x5678
add r1, pc
mov r0, [r1]
这段代码相当于吗?
LDR r0, [pc, 0x5678]
引自第 4.9.4 节ARM指令集文档(ARM DDI 0029E):
使用时R15
作为基址寄存器,您必须记住它包含一个 8 字节的地址
从当前指令的地址开始。
这样该指令将加载位于 4 个字节的字after当前指令,希望包含有效地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)