代码之家  ›  专栏  ›  技术社区  ›  NotGI

ARM中的推送和弹出命令

  •  4
  • NotGI  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  8
  •   NickJH    7 年前

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

    换句话说,想象推送就像存储{LR,R2,R1,R0}。

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

        2
  •  1
  •   Hazem Abaza    5 年前

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

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