ARM中的PUSH和POP顺序

时间:2017-11-04 10:31:38

标签: arm stack

我试图理解ARM程序集中函数的开始和结束:

PUSH {R0-R2, LR}
POP {R0-R2, PC}

在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

似乎PC得到R0的值,它应该得到LR的值。
PC不能获得LR的值吗?

2 个答案:

答案 0 :(得分:2)

当您按下或弹出一堆寄存器时,无论方向如何,它们总是以相同的相对位置进入存储器。最低编号寄存器存储在最低地址并从最低地址加载。因此,在此示例中,除了LR-> PC之外,所有内容都将返回到原始寄存器。

换句话说,假设PUSH好像存储了{LR,R2,R1,R0}。

请参阅您最喜欢的Arm 32位处理器系列的用户指南/指令集参考; LDM和STM。

答案 1 :(得分:0)

在PC的寄存器列表中的POP指令是跳转到堆栈外的值的分支指令。 所以

POP {R0, PC} ~= MOV PC,R0 ; Except that R0 is on the stack