我试图理解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的值吗?
答案 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