这是我的理解:
- 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]
mov
不能接受一个内存操作数(ARM是一个加载存储架构),因此该代码是无效的 - 如果第三条指令是ldr r0,[r1]
,则等效。ldr r0,[pc,0x5678]
不能编码为单个指令,因为立即数太大了(即它不能由偶数位旋转的8位值表示)。 - Notlikethat