Arm 臂组件-多推/弹出订单和SP

Arm 臂组件-多推/弹出订单和SP,arm,stack,Arm,Stack,我见过一个注释,用于在同一行中推/弹出多个寄存器,例如: push {fp, lr} 我找不到谁先被推——fp还是lr 另一个问题-SP指向堆栈中最后一个被占用的地址还是第一个空闲地址?来自ARM: 寄存器按顺序存储,从编号最低的寄存器到最低的内存地址(起始地址),再到编号最高的寄存器到最高的内存地址(结束地址) 在ARM上,堆栈指针通常指向堆栈上最后占用的地址。例如,在设置初始堆栈指针时,通常使用超过堆栈末尾的地址1进行初始化 PUSH只是使用sp作为基址寄存器的STMDB的同义词。D

我见过一个注释,用于在同一行中推/弹出多个寄存器,例如:

push    {fp, lr}
我找不到谁先被推——fp还是lr

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

来自ARM:

寄存器按顺序存储,从编号最低的寄存器到最低的内存地址(起始地址),再到编号最高的寄存器到最高的内存地址(结束地址)

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


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

超过堆栈末尾一次有多平静?它不会指向最后一个空地址吗?这取决于你所说的“结束”是什么意思。我是说最高的地址。堆栈通常从高地址增长到低地址。这意味着推送会使堆栈指针递减,然后存储一个字。pop加载一个单词,然后增加堆栈指针。要直接回答问题,将在
lr=r14
之前按下
fp=r11
。这个顺序在结语中使用,您可能会看到
pop{fp,pc}
,因为
pc=r15
在链接寄存器旁边编号。@artlessnoise,我想这取决于您所说的“before”是什么意思。如果它们是用独立的
push
指令按数字顺序推送的,而不是作为一个组,则情况正好相反。不管堆栈是升序还是降序,它们都是按该顺序存储的,好吧。我很确定ARM在LDM/STM内存传输方面就是这么说的。所以按时间顺序,它是在之前。我不知道你是指记忆顺序;那要看情况。