4.3.2. LDR 和 STR(直接偏移量)

带有直接偏移量、前变址直接偏移量或后变址直接偏移量的加载和存储。

语法

op{type}{cond} Rt, [Rn {, #offset}]        ; immediate offset

op{type}{cond} Rt, [Rn, #offset]!          ; pre-indexed

op{type}{cond} Rt, [Rn], #offset           ; post-indexed

opD{cond} Rt, Rt2, [Rn {, #offset}]        ; immediate offset, doubleword

opD{cond} Rt, Rt2, [Rn, #offset]!          ; pre-indexed, doubleword

opD{cond} Rt, Rt2, [Rn], #offset           ; post-indexed, doubleword

其中:

op

是下列项之一:

LDR

加载寄存器。

STR

存储寄存器。

type

是下列项之一:

B

无符号字节(加载时零扩展为 32 位。)

SB

有符号字节(仅 LDR。 符号扩展为 32 位。)

H

无符号半字(加载时零扩展为 32 位。)

SH

有符号半字(仅 LDR。 符号扩展为 32 位。)

-

如果是字,则省略。

cond

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

Rt

要加载或存储的寄存器。

Rn

内存地址所基于的寄存器。

offset

是偏移量。 如果省略了 offset,则该地址为 Rn 中的地址。

Rt2

为附加寄存器,在双字运算中使用,用于加载或存储。

这些选项并非在所有指令集和体系结构中均可用。 有关详细信息,请参阅偏移量范围和体系结构

偏移量范围和体系结构

Table 4.2 给出了偏移量的范围以及这些指令的可用性。

Table 4.2. 偏移量和体系结构、LDR/STR、字、半字和字节 

指令 直接偏移量 前变址偏移量 后变址偏移量 体系结构
ARM,字或字节[1] -4095 到 4095 -4095 到 4095 -4095 到 4095 所有
ARM,有符号字节,半字或有符号半字 -255 到 255 -255 到 255 -255 到 255 所有
ARM,双字 -255 到 255 -255 到 255 -255 到 255 v5TE +
32 位 Thumb,字、半字,有符号半字,字节或有符号字节 [1] -255 到 4095 -255 到 255 -255 到 255 v6T2,v7
32 位 Thumb,双字 -1020 到 1020 [3] -1020 到 1020 [3] -1020 到 1020 [3] v6T2,v7
16 位 Thumb,字[2] 0 到 124[3] 不可用 不可用 所有 T
16 位 Thumb,无符号半字 [2] 0 到 62[4] 不可用 不可用 所有 T
16 位 Thumb,无符号字节 [2] 0 到 31 不可用 不可用 所有 T
16 位 Thumb,字,Rn 为 r13[5] 0 到 1020 [3] 不可用 不可用 所有 T
16 位 ThumbEE,字 [2] -28 到 124 [3] 不可用 不可用 T-2EE
16 位 ThumbEE,字,Rn 为 r9 [5] 0 到 252 [3] 不可用 不可用 T-2EE
16 位 ThumbEE,字,Rn 为 r10 [5] 0 到 124 [3] 不可用 不可用 T-2EE

[1] 对于加载字,Rt 可为 pc。 加载 pc 将引发到所加载地址的跳转。 对于 ARMv4,所加载的地址的位 [1:0] 必须为 0b00。 对于 ARMv5 及更高版本处理器,位 [1:0] 不能为 0b10;如果位 [0] 为 1,则在 Thumb 状态下继续执行,否则要在 ARM 状态下才能继续执行。

[2] Rt 和 Rn 必须在 r0-r7 范围内。

[3] 必须要能被 4 整除。

[4] 必须要能被 2 整除。

[5] Rt 必须在 r0-r7 范围内。

双字寄存器限制

对于 Thumb-2 指令,请一定不要将 RtRt2 指定为 sp 或 pc。

对于 ARM 指令:

  • Rt 必须为编号为偶数的寄存器

  • Rt 不能为 lr

  • 强烈建议您不要将 r12 用作 Rt

  • Rt2 必须为 R(t + 1)。

示例


    LDR     r8,[r10]            ; loads r8 from the address in r10.



    LDRNE   r2,[r5,#960]!       ; (conditionally) loads r2 from a word

                                ; 960 bytes above the address in r5, and

                                ; increments r5 by 960.



    STR     r2,[r9,#consta-struc]   ; consta-struc is an expression evaluating

                                    ; to a constant in the range 0-4095.

Copyright © 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HC
Non-Confidential