4.2.9. PUSH 和 POP

将寄存器推入满降序堆栈,从满降序堆栈中弹出寄存器。

语法

PUSH{cond} reglist
POP{cond} reglist

其中:

cond

是一个可选的条件代码(请参阅条件执行)。

reglist

是一个非空的寄存器列表,括在大括号内。可以包含寄存器范围。 如果包含多个寄存器或寄存器范围,则必须用逗号分隔。

用法

对于基址寄存器 sp (r13) 和经调整后写回基址寄存器中的地址,PUSHPOPSTMDBLDM(或 LDMIA)的同义词。在这些情况下,PUSHPOP 为首选助记符。

寄存器按编号顺序存储在堆栈中,编号最小的寄存器存储在最低地址。

POP,reglist 中包含 pc

此指令会产生一个跳转,会转到从堆栈弹出的存放到了 pc 中的地址处。 这种跳转通常是从子程序返回,其中 lr 是在子程序开始执行时推入堆栈中的。

在 ARMv5 及更高版本中:

  • 位 [1:0] 不能为 0b10

  • 如果位 [0] 为 1,则将会在 Thumb 状态下继续执行

  • 如果位 [0] 为 0,则将会在 ARM 状态下继续执行。

在 ARMv4 中,所加载的地址的位 [1:0] 必须为 0b00。POP 不能用于更改状态。

Thumb 指令

这些指令中的某些指令可用于 Thumb 指令集。

对于 16 位指令,存在下列限制:

  • 对于 PUSHreglist 只能包含 Lo 寄存器和 lr

  • 对于 POPreglist 只能包含 Lo 寄存器和 pc。

对于 32 位指令,存在下列限制:

  • reglist 不能包含 sp

  • 对于 PUSHreglist 不能包含 pc

  • 对于 POPreglist 可以包含 lr 或 pc 中的一个,但不能同时包含两者。

示例

    PUSH    {r0,r4-r7}
    PUSH    {r2,lr}
    POP     {r0,r10,pc} ; no 16-bit version available
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IC
Non-Confidential