我试图了解 ARM 程序集中函数的开始和结束:
PUSH {R0-R2, LR}
POP {R0-R2, PC}
Run Code Online (Sandbox Code Playgroud)
看看 IDA 中的这段代码,这是我的理解(假设 SP 是 0x100):
PUSH R0 ; sp = 0xFC
PUSH R1 ; sp = 0xF8
PUSH R2 ; sp = 0xF4
PUSH LR ; sp = 0xF0
POP R0 ; sp = 0xF4
POP R1 ; sp = 0xF8
POP R2 ; sp = 0xFC
POP PC ; sp = 0x100
Run Code Online (Sandbox Code Playgroud)
看起来 PC 获得了 R0 的值,而它应该获得 LR 的值。
PC不应该得到LR的值吗?
小智 6
当您 PUSH 或 POP 一堆寄存器时,无论方向如何,它们总是以相同的相对位置进入内存。最低编号的寄存器存储在最低地址并从最低地址加载。所以在这个例子中,除了 LR->PC 之外,一切都将返回到原始寄存器。
换句话说,将 PUSH 想象成存储 {LR,R2,R1,R0}。
请参阅您最喜欢的 Arm 32 位处理器系列的用户指南/指令集参考;LDM 和 STM。
| 归档时间: |
|
| 查看次数: |
5091 次 |
| 最近记录: |