Technical Support
On-Line Manuals
Assembler Reference
Conventions and feedback
Assembler command line options
ARM and Thumb Instructions
Instruction summary
Instruction width specifiers
Memory access instructions
General data processing instructions
Flexible second operand (Operand2)
Operand2 as a constant
Operand2 as a register with optional shift
Shift operations
Multiply instructions
Saturating instructions
Parallel instructions
Parallel add and subtract
Packing and unpacking instructions
Branch and control instructions
Coprocessor instructions
Miscellaneous instructions
ThumbEE instructions
Pseudo-instructions
Condition codes
ADD, SUB, RSB, ADC, SBC, and RSC
ADR (PC-relative)
ADR (register-relative)
ADRL pseudo-instruction
AND, ORR, EOR, BIC, and ORN
ASR, LSL, LSR, ROR, and RRX
B, BL, BX, BLX, and BXJ
BFC and BFI
BKPT
CBZ and CBNZ
CDP and CDP2
CHKA
CLREX
CLZ
CMP and CMN
CPS
CPY pseudo-instruction
DBG
DMB, DSB, and ISB
ENTERX and LEAVEX
ERET
HB, HBL, HBLP, and HBP
IT
LDC, LDC2, STC, and STC2
LDM and STM
LDR and STR (immediate offset)
LDR and STR (register offset)
LDR and STR, unprivileged
LDR (PC-relative)
LDR (register-relative)
LDR pseudo-instruction
LDREX and STREX
MAR and MRA
MCR, MCR2, MCRR, and MCRR2
MIA, MIAPH, and MIAxy
MOV and MVN
MOV32 pseudo--instruction
MOVT
MRC, MRC2, MRRC and MRRC2
MRS (system coprocessor register to ARM register)
MRS (PSR to general-purpose register)
MSR (ARM register to system coprocessor register)
MSR (general-purpose register to PSR)
MUL, MLA, and MLS
NEG pseudo-instruction
PKHBT and PKHTB
PLD, PLDW, and PLI
PUSH and POP
QADD, QSUB, QDADD, and QDSUB
REV, REV16, REVSH, and RBIT
RFE
SBFX and UBFX
SDIV and UDIV
SEL
SETEND
SEV, WFE, WFI, and YIELD
SMC
NOP
SMLAD and SMLSD
SMLALxy
SMLALD and SMLSLD
SMMUL, SMMLA, and SMMLS
SMUAD{X} and SMUSD{X}
SMULxy and SMLAxy
SMULWy and SMLAWy
SRS
SSAT and USAT
SSAT16 and USAT16
SUBS pc, lr
SVC
SWP and SWPB
SXT, SXTA, UXT, and UXTA
SYS
TBB and TBH
TST and TEQ
UMULL, UMLAL, SMULL, and SMLAL
UMAAL
UND pseudo-instruction
USAD8 and USADA8
VFP Programming
Directives Reference
|
Assembler Reference
LDR and STR (register offset)
LDR and STR (register offset)Load and Store with register offset, pre-indexed register
offset, or post-indexed register offset. Syntax
op{type}{cond} Rt, [Rn, +/-Rm {, shift}] ; register offset
op{type}{cond} Rt, [Rn, +/-Rm {, shift}]! ; pre-indexed ; ARM only
op{type}{cond} Rt, [Rn], +/-Rm {, shift} ; post-indexed ; ARM only
opD{cond} Rt, Rt2, [Rn, +/-Rm] ; register offset, doubleword ; ARM only
opD{cond} Rt, Rt2, [Rn, +/-Rm]! ; pre-indexed, doubleword ; ARM only
opD{cond} Rt, Rt2, [Rn], +/-Rm ; post-indexed, doubleword ; ARM only
where: optypecan 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.) -
condis an optional condition code. Rtis the register to load or store. Rnis the register on which the memory address is based. Rmis a register containing a value to be used as the
offset. -Rm is not
permitted in Thumb code. shiftRt2is the additional register to load or store for
doubleword operations.
Not all options are available in every instruction set and
architecture. Offset register and shift options
Table 10 shows
the ranges of offsets and availability of these instructions. Table 10. Options and architectures, LDR/STR (register offsets) | Instruction | +/-Rm [] | shift | | | Arch.[] |
|---|
| ARM, word or byte [] | +/-Rm | LSL #0-31 | LSR #1-32 | | All | | | | ASR #1-32 | ROR #1-31 | RRX | | | ARM, signed byte, halfword, or signed halfword | +/-Rm | Not available | All | | ARM, doubleword | +/-Rm | Not available | 5E | | 32-bit Thumb, word, halfword, signed halfword, byte,
or signed byte [] | +Rm | LSL #0-3 | | | T2 | | 16-bit Thumb, all except doubleword[] | +Rm | Not available | T | | 16-bit ThumbEE, word [] | +Rm | LSL #2 (required) | EE | | 16-bit ThumbEE, halfword, signed halfword [] | +Rm | LSL #1 (required) | EE | | 16-bit ThumbEE, byte, signed byte [] | +Rm | Not available | EE |
Register restrictions
In the pre-index and post-index forms: Doubleword register restrictions
For ARM instructions: Rt must
be an even-numbered register
Rt must
not be LR
it is strongly recommended that you do not use R12 for Rt Rt2 must
be R(t + 1)
Rm must
be different from Rt and Rt2 in LDRD instructions
Rn must
be different from Rt2 in
the pre-index and post-index forms.
Use of PC
In ARM instructions: You can
use PC for Rt in LDR word
instructions, and you can use PC for Rn in LDR instructions
with register offset syntax (that is the forms that do not writeback
to the Rn). You can use PC for Rt in STR word
instructions, and you can use PC for Rn in STR instructions
with register offset syntax (that is the forms that do not writeback
to the Rn). However,
these are deprecated in ARMv6T2 and above.
Other uses of PC are not permitted in ARM instructions. In Thumb instructions you can use PC for Rt in LDR word
instructions. Other uses of PC in these Thumb instructions are not
permitted. Use of SP
You can use SP for Rn. In ARM, you can use SP for Rt in
word instructions. You can use SP for Rt in
non-word ARM instructions but this is deprecated in ARMv6T2 and
above. You can use SP for Rm in
ARM instructions but this is deprecated in ARMv6T2 and above. In Thumb, you can use SP for Rt in
word instructions only. All other use of SP for Rt in
these instructions are not permitted in Thumb code. Use of SP for Rm is
not permitted in Thumb state. See also
|