【发布时间】:2014-07-29 17:38:13
【问题描述】:
我是这样理解这个故事的:
- PC 寄存器保存指向下一条指令的指针
- LDR 指令正在将第二个操作数的值加载到第一个操作数中
(例如)
LDR r0, [pc, 0x5678]
相当于这个“C代码”r0 = *(pc + 0x5678)
它是使用基本偏移量取消引用的指针。
还有我的问题:
我找到了这段代码
LDR PC, [PC,-4]它被评论为猴子补丁等。
我如何理解这段代码
pc = *(pc - 4)
在这种情况下,“pc”寄存器将取消引用前一条指令的地址,并将包含指令的“机器码”(不是指令的地址), 并且程序将跳转到该无效地址以继续执行,并且可能我们会得到“Segmentation Fault”。 那么我错过了什么或不理解什么?
让我想到的是 LDR 指令中第二个操作数的括号。
据我所知,x86 架构括号已经取消引用指针,但我无法理解 ARM 架构中的含义。
这段代码是否等同于?
LDR r0,[pc,0x5678]【问题讨论】:
-
重新编辑:
mov不能采用内存操作数(ARM 是加载存储体系结构),因此代码按原样无效 - 如果第三条指令是ldr r0, [r1]它将是等效的.ldr r0, [pc, 0x5678]不能编码为单条指令,因为立即数太大(即不能用偶数位旋转的 8 位值表示)。 -
不喜欢,谢谢,这是我的问题
标签: assembly arm patch monkeypatching