Technical Support On-Line Manuals RealView Assembler User's Guide Preface Introduction Writing ARM Assembly Language Assembler Reference ARM and Thumb Instructions Instruction summary Memory access instructions Address alignment LDR and STR (immediate offset) LDR and STR (register offset) LDR and STR (User mode) LDR (pc-relative) ADR PLD, PLDW, and PLI LDM and STM PUSH and POP RFE SRS LDREX and STREX CLREX SWP and SWPB General data processing instructions Flexible second operand ADD, SUB, RSB, ADC, SBC, and RSC SUBS pc, lr AND, ORR, EOR, BIC, and ORN CLZ CMP and CMN MOV and MVN MOVT TST and TEQ SEL REV, REV16, REVSH, and RBIT ASR, LSL, LSR, ROR, and RRX SDIV and UDIV Multiply instructions MUL, MLA, and MLS UMULL, UMLAL, SMULL, and SMLAL SMULxy and SMLAxy SMULWy and SMLAWy SMLALxy SMUAD{X} and SMUSD{X} SMMUL, SMMLA, and SMMLS SMLAD and SMLSD SMLALD and SMLSLD UMAAL Saturating instructions Saturating arithmetic QADD, QSUB, QDADD, and QDSUB SSAT and USAT Parallel instructions Parallel add and subtract USAD8 and USADA8 SSAT16 and USAT16 Packing and unpacking instructions BFC and BFI SBFX and UBFX SXT, SXTA, UXT, and UXTA PKHBT and PKHTB Branch and control instructions B, BL, BX, BLX, and BXJ IT CBZ and CBNZ TBB and TBH Coprocessor instructions CDP and CDP2 MCR, MCR2, MCRR, and MCRR2 MRC, MRC2, MRRC and MRRC2 LDC, LDC2, STC, and STC2 Miscellaneous instructions BKPT SVC MRS MSR CPS SMC SETEND NOP, SEV, WFE, WFI, and YIELD DBG, DMB, DSB, and ISB Instruction width selection in Thumb Instruction width specifiers, .W and .N Different behavior for some instructions Diagnostic warning ThumbEE instructions ENTERX and LEAVEX CHKA HB, HBL, HBLP, and HBP Pseudo-instructions ADRL pseudo-instruction MOV32 pseudo-instruction LDR pseudo-instruction UND pseudo-instruction Directives Reference | LDM and STMLoad and Store Multiple registers. Any combination of registers r0 to r15 can be transferred in ARM state, but there are some restrictions in Thumb state. See also PUSH and POP.
op{addr_mode}{cond} Rn{!}, reglist{^}
where: opcan be either: LDMSTMStore Multiple registers.
addr_modeis any one of the following: IAIncrement address After each transfer. This is the default, and can be omitted. IBIncrement address Before each transfer (ARM only). DADecrement address After each transfer (ARM only). DBDecrement address Before each transfer.
See Table 2.9 for stack oriented addressing mode suffixes. condRnis the base register, the ARM register holding the initial address for the transfer. Rn must not be r15. !is an optional suffix. If ! is present, the final address is written back into Rn. reglist^is an optional suffix, available in ARM state only. You must not use it in User mode or System mode. It has the following purposes: If the instruction is LDM (with any addressing mode) and reglist contains the pc (r15), in addition to the normal multiple register transfer, the SPSR is copied into the CPSR. This is for returning from exception handlers. Use this only from exception modes. Otherwise, data is transferred into or out of the User mode registers instead of the current mode registers.
Restrictions on reglist in 32-bit Thumb-2 instructionsIn 32-bit Thumb-2 instructions: the sp cannot be in the list the pc cannot be in the list in an STM instruction the pc and lr cannot both be in the list in an LDM instruction there must be two or more registers in the list.
If you write an STM or LDM instruction with only one register in reglist, the assembler automatically substitutes the equivalent STR or LDR instruction. Be aware of this when comparing disassembly listings with source code. You can use the --diag_warning 1645 assembler command-line option to check when an instruction substitution occurs. 16-bit versions of a subset of these instructions are available in Thumb-2 code, and in Thumb code on pre-Thumb-2 processors. The following restrictions apply to the 16-bit instructions: all registers in reglist must be Lo registers Rn must be a Lo register
addr_mode must be omitted (or IA), meaning increment address after each transfer
writeback must be specified for STM instructions writeback must be specified for LDM instructions where Rn is not in the reglist.
In addition, the PUSH and POP instructions can be expressed in this form. Some forms of PUSH and POP are also 16-bit instructions. See PUSH and POP for details. NoteThese 16-bit instructions are not available in Thumb-2EE. A load to the pc causes a branch to the instruction at the address loaded. In ARMv4, bits[1:0] of the address loaded must be 0b00. In ARMv5 and above: bits[1:0] must not be 0b10 if bit[0] is 1, execution continues in Thumb state if bit[0] is 0, execution continues in ARM state.
Loading or storing the base register, with writebackIn ARM code or pre-Thumb-2 Thumb code, if Rn is in reglist, and writeback is specified with the ! suffix: if the instruction is STM or STMIA and Rn is the lowest-numbered register in reglist, the initial value of Rn is stored otherwise, the loaded or stored value of Rn cannot be relied upon.
In Thumb-2 code, if Rn is in reglist, and writeback is specified with the ! suffix: all 32-bit instructions are unpredictable 16-bit instructions behave in the same way as in pre-Thumb-2 Thumb code, but the use of these instructions is deprecated.
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
|