4.2.8. LDM 和 STM

加载和存储多个寄存器。 寄存器 r0 到 r15 的任何组合均可在 ARM 状态下传输,但在 Thumb 状态下,会存在一些限制。

另请参阅PUSH 和 POP

语法

op{addr_mode}{cond} Rn{!}, reglist{^}

其中:

op

可为以下指令之一:

LDM

加载多个寄存器

STM

存储多个寄存器。

addr_mode

为下列项之一:

IA

在每次传送后增大地址。 这是缺省情况,可以省略。

IB

每次传送之前增大地址(仅 ARM)。

DA

每次传送后递减地址(仅 ARM)。

DB

每次传送前递减地址。

有关面向堆栈的寻址模式后缀,请参阅Table 2.9

cond

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

Rn

基址寄存器,即存储用于传送的初始地址的 ARM 寄存器。 Rn 不能为 r15。

!

是一个可选的后缀。 如果有 ! ,则最终地址将写回到 Rn 中。

reglist

是一个或多个要加载或存储的寄存器列表,括在大括号内。 可包含寄存器范围。 如果包含多个寄存器或寄存器范围,则必须用逗号隔开(请参阅示例)。

请参阅32 位 Thumb-2 指令中的 reglist 限制

^

为一个可选后缀,仅可用于 ARM 状态。 不可在用户模式或系统模式下使用该后缀。 该后缀具有下列功能:

  • 如果指令为 LDM(具有任何寻址模式)且 reglist 包含 pc (r15),则除了正常的多寄存器传送外,还会将 SPSR 复制到 CPSR 中。 这是为了从异常处理程序返回。 请仅在异常模式下使用此后缀。

  • 否则,数据将被送入或送出用户模式寄存器,而不是当前模式寄存器。

32 位 Thumb-2 指令中的 reglist 限制

在 32 位 Thumb-2 指令中:

  • 不可将 sp 放入列表

  • 不可将 pc 放入 STM 指令列表

  • 不可将 pc 和 lr 同时放入 LDM 指令的列表

  • 列表中必须要有两个以上的寄存器

如果您编写的 STMLDM 指令的 reglist 中仅有一个寄存器,则汇编器将会自动用等效的 STRLDR 指令替换这些指令。 在比较反汇编列表与源代码时,请注意这一点。

可以使用 --diag_warning 1645 汇编器命令行选项来检查是否发生指令替换。

16 位指令

在这些指令当中,有些指令的 16 位版本可用于 Thumb-2 代码和 Thumb-2 之前的处理器上的 Thumb 代码。

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

  • reglist 中的所有寄存器都必须为 Lo 寄存器

  • Rn 必须为 Lo 寄存器

  • addr_mode 必须省略(或为 IA),这意味着在每次传送之后增大地址

  • 必须为 STM 指令指定回写

  • 必须为 LDM 指令指定回写,其中的 Rn 不在 reglist 中。

此外,PUSHPOP 指令也可以这种格式表示。 PUSHPOP 的某些形式也是 16 位指令。 有关详细信息,请参阅PUSH 和 POP

Note

这些 16 位指令不可用于 Thumb-2EE 中。

加载到 pc

加载 pc(程序计数器)将会使指令跳转到所加载地址处。

对于 ARMv4,所加载的地址的位 [1:0] 必须为 0b00。

在 ARMv5 及更高版本中:

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

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

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

加载或存储基址寄存器,带回写

在 ARM 代码或 Thumb-2 之前的 Thumb 代码中,如果 Rnreglist 中,且使用后缀 ! 指定了回写, 则:

  • 如果指令是 STMSTMIA,且 Rnreglist 中编号最小的寄存器,则会存储 Rn 的初始值

  • 否则,所加载或存储的 Rn 值将不可预知。

在 Thumb-2 代码中,如果 Rnreglist 中,且使用后缀 ! 指定了回写, 则:

  • 所有 32 位指令都是不可预测的

  • 16 位指令的行为方式与在 Thumb-2 之前的 Thumb 代码中相同,但不提倡使用这些指令。

示例

    LDM     r8,{r0,r2,r9}      ; LDMIA is a synonym for LDM
    STMDB   r1!,{r3-r6,r11,r12}

不正确的示例

    STM     r5!,{r5,r4,r9} ; value stored for r5 unpredictable 
    LDMDA   r2, {}         ; must be at least one register in list
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IC
Non-Confidential