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
MOV and MVN
Move and Move Not. Syntax
MOV{S}{cond} Rd, Operand2
MOV{cond} Rd, #imm16
MVN{S}{cond} Rd, Operand2
where: Sis an optional suffix. If S is
specified, the condition code flags are updated on the result of
the operation. condis an optional condition code. Rdis the destination register. Operand2is a flexible second operand. imm16is any value in the range 0-65535.
Usage
The MOV instruction copies the value of Operand2 into Rd. The MVN instruction takes the value of Operand2,
performs a bitwise logical NOT operation on the value, and places
the result into Rd. In certain circumstances, the assembler can substitute MVN for MOV,
or MOV for MVN. Be aware of this when
reading disassembly listings. Use of PC and SP in 32-bit Thumb MOV and MVN
You cannot use PC (R15) for Rd,
or in Operand2, in
32-bit Thumb MOV or MVN instructions.
With the following exceptions, you cannot use SP (R13)
for Rd, or in Operand2: MOV{cond}.W Rd,
SP, where Rd is
not SP
MOV{cond}.W SP, Rm,
where Rm is not SP.
Use of PC and SP in 16-bit Thumb
You can use PC or SP in 16-bit Thumb MOV{cond}
Rd, Rm instructions but these instructions in which both Rd and Rm are
SP or PC are deprecated in ARMv6T2 and above. You cannot use PC or SP in any other MOV{S} or MVN{S} 16-bit
Thumb instructions. Use of PC and SP in ARM MOV and MVN
You cannot use PC for Rd or
any operand in any data processing instruction that has a register-controlled
shift. In instructions without register-controlled shift, use of
PC is deprecated except the following cases: MOVS PC, LR
MOV PC, Rm when Rm is
not PC or SP
MOV Rd, PC when Rd is
not PC or SP.
You can use SP for Rd or Rm.
But these are deprecated except the following cases: MOV SP, Rm when Rm is
not PC or SP
MOV Rd, SP when Rd is
not PC or SP.
NoteYou cannot use PC for Rd in MOV
Rd, #imm16 if
the #imm16 value is not a permitted Operand2 value.
You can use PC in forms with Operand2 without
register-controlled shift. The deprecation of PC and SP in ARM instructions
only apply to ARMv6T2 and above.
If you use PC as Rm,
the value used is the address of the instruction plus 8. If you use PC as Rd: Execution branches to the
address corresponding to the result. If you use the S suffix,
see the SUBS pc,lr instruction.
Condition flags
If S is specified, these instructions: update the N and Z flags
according to the result can update the C flag during the calculation of Operand2 do not affect the V flag.
16-bit instructions
The following forms of these instructions are available in
Thumb code, and are 16-bit instructions: MOVS Rd,
#immRd must
be a Lo register. imm range
0-255.
MOVS Rd, RmRd and Rm must
both be Lo registers.
MOV Rd, RmIn architectures before ARMv6, either Rd or Rm,
or both, must be a Hi register. In ARMv6 and above, this restriction
does not apply. MVNS Rd, RmRd and Rm must
both be Lo registers. This form can only be used outside an IT block.
MVN{cond} Rd, RmRd and Rm must
both be Lo registers. This form can only be used inside an IT block.
Architectures
The #imm16 form
of the ARM instruction is available in ARMv6T2 and above. The other
forms of the ARM instruction are available in all versions of the
ARM architecture. These 32-bit Thumb instructions are available in ARMv6T2 and
above. These 16-bit Thumb instructions are available in all T variants
of the ARM architecture. Example
MVNNE r11, #0xF000000B ; ARM only. This immediate value is not
; available in T2.
Incorrect example
MVN pc,r3,ASR r0 ; PC not permitted with register-controlled shift
See also
|