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
SUBS pc, lr
Exception return, without popping anything from the stack. Syntax
SUBS{cond} pc, lr, #imm ; ARM and Thumb code
MOVS{cond} pc, lr ; ARM and Thumb code
op1S{cond} pc, Rn, #imm ; ARM code only and is deprecated
op1S{cond} pc, Rn, Rm {, shift} ; ARM code only and is deprecated
op2S{cond} pc, #imm ; ARM code only and is deprecated
op2S{cond} pc, Rm {, shift} ; ARM code only and is deprecated
where: op1is one of ADC, ADD, AND, BIC, EOR, ORN, ORR, RSB, RSC, SBC,
and SUB. op2condis an optional condition code. immis an immediate value. In Thumb code, it is limited
to the range 0-255. In ARM code, it is a flexible second operand. Rnis the first operand register. ARM deprecates the
use of any register except LR. Rmis the optionally shifted second or only operand
register. shiftis an optional condition code.
Usage
SUBS pc, lr, #imm subtracts
a value from the link register and loads the PC with the result,
then copies the SPSR to the CPSR.
You can use SUBS pc, lr, #imm to
return from an exception if there is no return state on the stack. The
value of #imm depends
on the exception to return from. Notes
SUBS pc, lr, #imm writes
an address to the PC. The alignment of this address must be correct for
the instruction set in use after the exception return:
For a return to ARM, the address written to the
PC must be word-aligned. For a return to Thumb, the address written to the
PC must be halfword-aligned. For a return to Jazelle, there are no alignment
restrictions on the address written to the PC.
The results of breaking these rules are unpredictable. However, no special
precautions are required in software, if the instructions are used
to return after a valid exception entry mechanism. In Thumb, only SUBS{cond}
pc, lr, #imm is a valid instruction. MOVS
pc, lr is a synonym of SUBS pc, lr, #0. Other
instructions are undefined. In ARM, only SUBS{cond} pc,
lr, #imm and MOVS{cond}
pc, lr are valid instructions. Other instructions are deprecated
in ARMv6T2 and above. CautionDo not use these instructions in User mode or System mode.
The effect of such an instruction is unpredictable,
but the assembler cannot warn you at assembly time. Architectures
This ARM instruction is available in all versions of the ARM
architecture. This 32-bit Thumb instruction is available in ARMv6T2 and
above, except the ARMv7-M architecture. There is no 16-bit Thumb version of this instruction. See also
|