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
Parallel add and subtract
Parallel add and subtractVarious byte-wise and halfword-wise additions and subtractions. Syntax
<prefix>op{cond} {Rd}, Rn, Rm
where: <prefix>is one of: SSigned
arithmetic modulo 28 or 216.
Sets APSR GE flags. QSigned
saturating arithmetic. SHSigned
arithmetic, halving the results. UUnsigned
arithmetic modulo 28 or 216.
Sets APSR GE flags. UQUnsigned
saturating arithmetic. UHUnsigned
arithmetic, halving the results.
opis one of: ADD8ADD16SUB8SUB16Halfword-wise
Subtraction. ASXExchange
halfwords of Rm,
then Add top halfwords and Subtract bottom halfwords. SAXExchange
halfwords of Rm,
then Subtract top halfwords and Add bottom halfwords.
condis an optional condition code. Rdis the destination register. Rm, Rnare the ARM registers holding the operands.
Operation
These instructions perform arithmetic operations separately
on the bytes or halfwords of the operands. They perform two or four
additions or subtractions, or one addition and one subtraction. You can choose various kinds of arithmetic: Signed or unsigned arithmetic modulo 28 or
216. This sets the APSR GE flags. Signed saturating arithmetic to one of the signed
ranges -215 ≤ x ≤
215 -1 or -27 ≤ x ≤
27 -1. The Q flag is not affected even
if these operations saturate. Unsigned saturating arithmetic to one of the unsigned
ranges 0 ≤ x ≤ 216 -1
or 0 ≤ x ≤ 28 -1.
The Q flag is not affected even if these operations saturate. Signed or unsigned arithmetic, halving the results.
This cannot cause overflow.
Register restrictions
You cannot use PC for any register. You can use SP in ARM instructions but these are deprecated
in ARMv6T2 and above. You cannot use SP in Thumb instructions. Condition flags
These instructions do not affect the N, Z, C, V, or Q flags. The Q, SH, UQ and UH prefix
variants of these instructions do not change the flags. The S and U prefix variants
of these instructions set the GE flags in the APSR as follows: For byte-wise operations, the GE flags are used
in the same way as the C (Carry) flag for 32-bit SUB and ADD instructions: GE[0] for bits[7:0] of the result GE[1] for
bits[15:8] of the result GE[2] for
bits[23:16] of the result GE[3] for
bits[31:24] of the result.
For halfword-wise operations, the GE flags are used
in the same way as the C (Carry) flag for normal word-wise SUB and ADD instructions: GE[1:0] for bits[15:0] of the result GE[3:2] for
bits[31:16] of the result.
You can use these flags to control a following SEL instruction. NoteFor halfword-wise operations, GE[1:0] are set or cleared together,
and GE[3:2] are set or cleared together. Architectures
These ARM instructions are available in ARMv6 and above. These 32-bit Thumb instructions are available in ARMv6T2 and
above. For the ARMv7-M architecture, they are only available in
an ARMv7E-M implementation. There are no 16-bit Thumb versions of these instructions. Examples
SHADD8 r4, r3, r9
USAXNE r0, r0, r2
Incorrect examples
QHADD r2, r9, r3 ; No such instruction, should be QHADD8 or QHADD16
SAX r10, r8, r5 ; Must have a prefix.
See also
|