【发布时间】:2020-08-07 15:05:45
【问题描述】:
ARM documentation 对 PUSH 和 POP 表示以下内容
PUSH 将寄存器存储在堆栈中,编号最小的寄存器 使用最低的内存地址和最高编号的寄存器 使用最高的内存地址。
POP 从堆栈中加载寄存器,编号最小的寄存器 使用最低的内存地址和最高编号的寄存器 使用最高的内存地址。
我发现一个tutorial 这么说
...{} 中的寄存器可以按任何顺序指定,但 它们出现在堆栈上的顺序是固定的...
所以根据上面的解释,一个PUSH括号中寄存器的顺序无关紧要。 IE。 PUSH {R0,R1,R2}、PUSH {R2,R1,R0} 和 PUSH {R1,R2,R0} 都将导致堆栈中的某些排序,因为 "...最低/最高编号的寄存器 (R0/R2) 使用最低/最高(堆栈)内存地址...”。
-
这是否意味着如果单个 PUSH 指令有多个寄存器 支架,装配器自动对推动动作进行排序 在目标代码中,
PUSH R2首先进入堆栈以 取最高地址,其次是PUSH R1,最后以PUSH R0取最低地址? -
因此,如果我想保证 R2 在 LIFO 堆栈中被最后推送并首先弹出(即 SP 指向 R2 或让 R2 取最低堆栈地址),我不能 在一个 PUSH 括号语句中这样做,但只能与
PUSH R0; PUSH R1; PUSH R2分开?
【问题讨论】: