ARM 中的 PUSH 和 POP 命令

Not*_*tGI 4 stack arm

我试图了解 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。