Arm 手臂中的推和弹出命令

Arm 手臂中的推和弹出命令,arm,stack,Arm,Stack,我试图理解ARM assembly中函数的开始和结束: PUSH {R0-R2, LR} POP {R0-R2, PC} 查看IDA中的这段代码,我的理解如下(假设SP为0x100): PC似乎得到了R0的值,而它应该得到LR的值。 PC不应该得到LR的值吗?当你按下或弹出一堆寄存器时,它们总是以相同的相对位置进入内存,而不管方向如何。最低编号寄存器存储在最低地址,并从最低地址加载。因此,在本例中,除了LR->PC,所有内容都将返回到原始寄存器 换一种说法,假设推送是存储{LR,R2,R1,R

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

PUSH {R0-R2, LR}
POP {R0-R2, PC}
查看IDA中的这段代码,我的理解如下(假设SP为0x100):

PC似乎得到了R0的值,而它应该得到LR的值。

PC不应该得到LR的值吗?

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

换一种说法,假设推送是存储{LR,R2,R1,R0}


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

寄存器列表中包含PC的POP指令是指向从堆栈中弹出的值的分支指令。 所以


POP{R0,PC}~=MOV-PC,R0;除了R0在堆栈上之外

所以,编号最低的寄存器将位于最低的地址,但是POP呢?以什么顺序发生?POP将以寄存器编号的升序加载它们,以匹配在SP递减时以降序存储它们的PUSH。[现在我不知道传输在总线上实际发生的顺序,通常这无关紧要。它们做的事情是正确的。]当然,按照标准函数调用约定,您通常不需要保存R0-R3。因此,总而言之,pop将首先弹出到编号最低的寄存器,PC将最后弹出,push将首先推送编号最高的寄存器,LR将首先推送。对吗?
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