臂组件 - 多个推/弹顺序和SP

Niv*_*Niv 5 stack arm

我已经看到了在同一行中推送/弹出多个寄存器的注释,例如:

push    {fp, lr}
Run Code Online (Sandbox Code Playgroud)

我找不到谁先被推 - fp或lr?

另一个问题 - SP是指向堆栈中的最后一个占用地址还是第一个空闲地址?

谢谢!

Car*_*rum 3

来自 ARM:

寄存器按顺序存储,从编号最低的寄存器到最低内存地址 (start_address),到编号最高的寄存器到最高内存地址 (end_address)

在 ARM 上,堆栈指针通常指向堆栈上最后占用的地址。例如,在设置初始堆栈指针时,通常使用超出堆栈末尾的地址进行初始化。

PUSH只是STMDB用作sp基址寄存器的同义词。表示DB“先递减”寻址模式。

  • 为了直接回答问题,将“fp=r11”推到“lr=r14”之前。这种顺序用在尾声中,您可能会看到“pop {fp,pc}”,因为“pc=r15”在*链接寄存器*旁边编号。 (4认同)