| |||
| Home > ARM and Thumb Instructions > Memory access instructions > LDR and STR (immediate offset) | |||
Load and Store with immediate offset, pre-indexed immediate offset, or post-indexed immediate offset.
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
where:
opcan be either:
LDRLoad Register
STRStore Register.
typecan be any one of:
Bunsigned Byte (Zero extend to 32 bits on loads.)
SBsigned
Byte (LDR only. Sign extend to 32 bits.)
Hunsigned Halfword (Zero extend to 32 bits on loads.)
SHsigned
Halfword (LDR only. Sign extend to 32 bits.)
-omitted, for Word.
condis an optional condition code.
Rtis the register to load or store.
Rnis the register on which the memory address is based.
offsetis an offset. If is
omitted, the address is the contents of offset.Rn
Rt2is the additional register to load or store for doubleword operations.
Not all options are available in every instruction set and architecture.
Table 5 shows the ranges of offsets and availability of these instructions.
Table 5. Offsets and architectures, LDR/STR, word, halfword, and byte
| Instruction | Immediate offset | Pre-indexed | Post-indexed | Arch. |
|---|---|---|---|---|
| ARM, word or byte [a] | -4095 to 4095 | -4095 to 4095 | -4095 to 4095 | All |
| ARM, signed byte, halfword, or signed halfword | -255 to 255 | -255 to 255 | -255 to 255 | All |
| ARM, doubleword | -255 to 255 | -255 to 255 | -255 to 255 | v5TE + |
| 32-bit Thumb, word, halfword, signed halfword, byte, or signed byte [a] | -255 to 4095 | -255 to 255 | -255 to 255 | v6T2, v7 |
| 32-bit Thumb, doubleword | -1020 to 1020 [c] | -1020 to 1020 [c] | -1020 to 1020 [c] | v6T2, v7 |
| 16-bit Thumb, word [b] | 0 to 124 [c] | Not available | Not available | All T |
| 16-bit Thumb, unsigned halfword [b] | 0 to 62 [d] | Not available | Not available | All T |
| 16-bit Thumb, unsigned byte [b] | 0 to 31 | Not available | Not available | All T |
16-bit Thumb, word, Rn is
SP [e] | 0 to 1020 [c] | Not available | Not available | All T |
| 16-bit ThumbEE, word [b] | -28 to 124 [c] | Not available | Not available | T-2EE |
16-bit ThumbEE, word, Rn is R9 [e] | 0 to 252 [c] | Not available | Not available | T-2EE |
16-bit ThumbEE, word, Rn is R10 [e] | 0 to 124 [c] | Not available | Not available | T-2EE |
[a] For word loads, Rt can be the PC. A load to the PC causes a branch to the address loaded. In ARMv4, bits[1:0] of the address loaded must be 0b00. In ARMv5T and above, bits[1:0] must not be 0b10, and if bit[0] is 1, execution continues in Thumb state, otherwise execution continues in ARM state. [b] Rt and Rn must be in the range R0-R7. [c] Must be divisible by 4. [d] Must be divisible by 2. [e] Rt must be in the range R0-R7. | ||||
R must be different
from nR in the pre-index
and post-index forms.t2
For Thumb instructions, you must not specify SP or PC for
either or Rt.Rt2
For ARM instructions:
must
be an even-numbered registerRt
must
not be LRRt
it is strongly recommended that you do not use R12 for Rt
must
be Rt2R(t + 1).
In ARM instructions:
You can
use PC for R in tLDR word
instructions and PC for R in nLDR instructions.
You can use PC for R in tSTR word
instructions and PC for R in nSTR instructions
with immediate offset syntax (that is the forms that do not writeback
to the R). However,
these are deprecated in ARMv6T2 and above.n
Other uses of PC are not permitted in these ARM instructions.
In Thumb instructions you can use PC for R in tLDR word
instructions and PC for R in nLDR instructions.
Other uses of PC in these Thumb instructions are not permitted.
You can use SP for R. n
In ARM, you can use SP for R in
word instructions. You can use SP for tR in
non-word instructions in ARM code but this is deprecated in ARMv6T2
and above.t
In Thumb, you can use SP for R in
word instructions only. All other use of SP for tR in
these instructions are not permitted in Thumb code.t
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.