Armv 7
Armv 7
AND{S} rx, ry, op2 rx = ry & op2 LDMDA rx{!}, rlist rlist = [rx−4×cnt+4]; if(!) rx−=4×cnt A
Arithmetic Instructions ASR{S} rx, ry, #j5 ¯ j
rx = ry LDMDB rx{!}, rlist rlist = [rx − 4×cnt]; if(!) rx−=4×cnt
ADC{S} rx, ry, op2 rx = ry + op2 + C ASR{S} rx, ry, Rs ¯ Rs
rx = ry LDMIA rx{!}, rlist rlist = [rx]; if(!) rx += 4×cnt
ADD{S} rx, ry, op2 rx = ry + op2 BFC rx, #p, #n rxp+n−1:p = 0n 6t LDMIB rx{!}, rlist rlist = [rx + 4]; if(!) rx += 4×cnt A
ADDW rx, ry, #i12 rx = ry + i∅ T BFI rx, ry, #p, #n rxp+n−1:p = ryn−1:0 6t LDR{T} rx, [addr] rx = [addr]
ADR rx, ±rel12 rx = PC ± rel BIC{S} rx, ry, op2 rx = ry & ∼op2 LDRB{T} rx, [addr] rx = [addr]∅8
CMN rx, op2 rx + op2 CLZ rx, ry rx = CountLeadingZeros(ry) LDRD rx, ry, [addr] ry:rx = [addr]
CMP rx, op2 rx − op2 EOR{S} rx, ry, op2 rx = ry ⊕ op2 LDRH{T} rx, [addr] rx = [addr]∅16
QADD rx, ry, rz rx = SATS(ry + rz, 32) D LSL{S} rx, ry, #i5 rx = ry i LDRSB{T} rx, [addr] rx = [addr]±
8
QDADD rx, ry, rz rx = SATS(ry + SATS(2×rz, 32), 32) D LSL{S} rx, ry, Rs rx = ry Rs LDRSH{T} rx, [addr] rx = [addr]±
16
QDSUB rx, ry, rz rx = SATS(ry − SATS(2×rz, 32), 32) D LSR{S} rx, ry, #j5 rx = ry j POP rlist rlist = [SP]; SP += 4×cnt
QSUB rx, ry, rz rx = SATS(ry − rz, 32) D LSR{S} rx, ry, Rs rx = ry Rs PUSH rlist SP −= 4×cnt; [SP] = rlist
RSB{S} rx, ry, op2 rx = op2 − ry MOV{S} rx, op2 rx = op2 STMDA rx{!}, rlist [rx−4×cnt+4] = rlist; if(!) rx−=4×cnt A
RSC{S} rx, ry, op2 rx = op2 − (ry + C) A MOVT rx, #i16 rx31:16 = i 6t STMDB rx{!}, rlist [rx − 4×cnt] = rlist; if(!) rx−=4×cnt
SBC{S} rx, ry, op2 rx = ry − (op2 + C) MOVW rx, #i16 rx = i∅ STMIA rx{!}, rlist [rx] = rlist; if(!) rx += 4×cnt
SDIV rx, ry, rz ¯ rz
rx = ry ÷ 7 MVN{S} rx, op2 rx = ∼op2 STMIB rx{!}, rlist [rx+4] = rlist; if(!) rx += 4×cnt A
SSAT rx, #j5 , ry{slr} rx = SATS(ry ¯ sh, j)± 6 ORN{S} rx, ry, op2 rx = ry | ∼op2 T STR{T} rx, [addr] [addr] = rx
SSAT16 rx, #j4 , ry rx = SATS(ry± ± ±
H1 , j) :SATS(ryH0 , j)
±
6,D ORR{S} rx, ry, op2 rx = ry | op2 STRB{T} rx, [addr] [addr]8 = rxB0
SUB{S} rx, ry, op2 rx = ry − op2 RBIT rx, ry rx = ReverseBits(ry) 6t STRD rx, ry, [addr] [addr] = ry:rx
SUBW rx, ry, #i12 rx = ry − i∅ T REV rx, ry rx = ryB0 :ryB1 :ryB2 :ryB3 6 STRH{T} rx, [addr] [addr]16 = rxH0
UDIV rx, ry, rz rx = ry ÷ rz 7 REV16 rx, ry rx = ryB2 :ryB3 :ryB0 :ryB1 6
rx = 3n=0 (ABS(ry∅Bn )−rz∅Bn )
P
USAD8 rx, ry, rz 6,D REVSH rx, ry rx = ry±
B0 :ryB1 6 ARM LDR/STR Addressing Modes
rx = rw + 3n=0 (ABS(ry∅Bn )−rz∅Bn ) [rz{, #±i8 }]{!} addr = rz ± i; if(!) rz = addr
P
USADA8 rx, ry, rz, rw 6,D ROR{S} rx, ry, #i5 rx = ry ≫ i non-T
USAT rx, #j5 , ry{slr} rx = SATU(ry ¯ sh, j)± 6 ROR{S} rx, ry, Rs rx = ry ≫ Rs xxR{,B} [rz{, #±i12 }]{!} addr = rz ± i; if(!) rz = addr
USAT16 rx, #i4 , ry rx = SATU(ry± ± ±
H1 , i) :SATU(ryH0 , i)
±
6,D RRX{S} rx, ry rx = C:ry31:1 ; C = ry0 any [rz]{, #±i8 } addr = rz; rz ±= i
SMUaD rx, ry, rz rx = ry± ׯ rz± ± ry± × ¯ rz± 6,D LDREX rx, [ry, #i10 ] rx = [ry+i∅9:2 :01:0 ]; SetExclusiveMonitor T,6k {T} LDR/STR instruction uses user privileges.
H0 H0 H1 H1
SMUaDX rx, ry, rz rx = ry± ¯
× rz± ± ry± ¯
× rz± D LDREXB rx, [ry] rx = [ry]∅8 ; SetExclusiveMonitor 6k a A or S to add or subtract operand.
H0 H1 H1 H0
ry:rx = [rz]; SetExclusiveMonitor x, y Selects bottom (B) or top (T) half of register(s)
SMULxy rx, ry, rz rx = ry±
Hx
¯
× rz±
Hy D LDREXD rx, ry, [rz] 6k
¯ rw LDREXH rx, [ry] rx = [ry]∅16 ; SetExclusiveMonitor 6k cc Condition code (can suffix most ARM instructions)
SMULL rx, ry, rz, rw ry:rx = rz ×
STREX rx,ry,[rz] if(Pass) [rz] = ry; rx = Pass ? 1 : 0 6k di DA, DB, IA or IB for decrease/increase before/after.
SMULL{S} rx, ry, rz, rw ¯ rw
ry:rx = rz × A
if(Pass) [rz+i∅9:2 :01:0 ]=ry; rx=Pass?1:0 i, j Immediate operand, range 0..max / 1..max+1
SMULWy rx, ry, rz ¯
rx = (ry × rz±
Hy )47:16 D STREX rx,ry,[rz,#i10 ] T,6k
if(Pass) [rz]8 = ryB0 ; rx = Pass?1:0 rx, ry, rz, rw General register
UMAAL rx, ry, rz, rw ry:rx = ry + rx + rz × rw D STREXB rx,ry,[rz] 6k
Rbanked Banked register
UMLAL rx, ry, rz, rw ry:rx += rz × rw STREXD rx,ry,rz,[rw] if(Pass) [rw] = rz:ry; rx = Pass?1:0 6k
rlist Comma separated list of registers within { }.
UMULL rx, ry, rz, rw ry:rx = rz × rw STREXH rx,ry,[rz] if(Pass) [rz]16 = ryH0 ; rx = Pass?1:0 6k
op2 Immediate or shifted register
System Instructions xPSR APSR, CPSR or SPSR
Parallel Instructions
SAT{S,U}(x,b) Saturated signed/unsigned b bit value
pADD16 rx, ry, rz for(n=0..1) rxHn = p(ryHn + rzHn ) 6,D CPSI{D,E} {aif}{, #mode} {a}{i}{f} = (E ? 1: 0); MODE = mode 6
B{0,1,2,3} Selected byte (bits 7:0, 15:8, 23:16 or 31:24)
pADD8 rx, ry, rz for(n=0..3) rxBn = p(ryBn + rzBn ) 6,D CPS #mode MODE = mode 6
H{0,1} Selected half word (bits 15:0 or 31:16)
pASX rx, ry, rz rx = p(ryH1 + rzH0 ):p(ryH0 − rzH1 ) 6,D ERET PC = LR; CPSR = SPSR 7
{rb} Optional rotate (ROR 8, ROR 16 or ROR 24)
pSAX rx, ry, rz rx = p(ryH1 − rzH0 ):p(ryH0 + rzH1 ) 6,D HVC #i16 CallHypervisor(i) 7
{slr} Optional shift (LSL #{1..31} or ASR #{1..32})
pSUB16 rx, ry, rz for(n=0..1) rxHn = p(ryHn − rzHn ) 6,D MRS rx, xPSR rx = {CPSR,SPSR}
{sl} Optional left shift (LSL #{1..31})
pSUB8 rx, ry, rz for(n=0..3) rxBn = p(ryBn − rzBn ) 6,D MRS rx, Rbanked rx = Rbanked 7
{sr} Optional right shift (ASR #{1..32})
SEL rx, ry, rz for(n=0..3) rxBn = (GEn ? ry : rz)Bn 6,D MSR xPSR, rx {CPSR,SPSR} = rx
{AS} ARM shift or rotate (LSL/ROR #{1..31}, LSR/ASR
MSR Rbanked, rx Rbanked = rx 7 #{1..32} or RRX)
Parallel Instruction Prefixes MSR xPSR {cxsf}, i {CPSR,SPSR}f;s;x;c = if;s;x;c A value± , value∅ Value is sign/zero extended
Q Signed operation, Results are saturated MSR xPSR {cxsf}, rx {CPSR,SPSR}f;s;x;c = rxf;s;x;c ¯ ÷
× ¯
¯ Operation is signed
S Signed operation, Results are truncated RFEdi rx{!} LDMdi rx{!}, {PC, CPSR}
SH Signed operation, Results are right shifted by one SMC #i4 CallSecureMonitor() 6k
U Unsigned operation, Results are truncated SRSdi SP{!}, #mode STMdi SP mode{!}, {LR, SPSR} 6
UH Unsigned operation, Results are right shifted by one
UQ Unsigned operation, Results are saturated
ARMv7 version 8 page 2
General Registers Thumb16 Bitwise and Move Instructions Thumb16 Arithmetic Instructions
R0-R3 Arguments and return values (useable by Thumb16) AND{S} rx, ry rx = rx & ry S ADC{S} rx, ry rx = rx + ry + C S
R4-R7 General purpose (must be preserved, useable by Thumb16) ASR{S} rx, ry, #j5 ¯ j
rx = ry S ADD{S} rx, ry, #i3 rx = ry + i∅ S
R8-R11 General purpose registers (must be preserved) ASR{S} rx, ry ¯ ry
rx = rx S ADD{S} rx, #i8 rx = rx + i∅ S
R12 IP Intra-procedure-call scratch register BIC{S} rx, ry rx = rx & ∼ry S ADD{S} rx, ry, rz rx = ry + rz S
R13 SP Stack pointer EOR{S} rx, ry rx = rx ⊕ ry S ADD rx, ry rx = rx + ry H
R14 LR Return address LSL{S} rx, ry, #i5 rx = ry i S ADD rx, SP, #i8 rx = SP + i∅
R15 PC Program counter LSL{S} rx, ry rx = rx ry S ADD SP, #i9 SP = SP + i∅8:2 :01:0
LSR{S} rx, ry, #j5 rx = ry j S ADR rx, rel10 rx = PC + rel∅9:2 :01:0
Condition Codes
LSR{S} rx, ry rx = rx ry S CMN rx, ry rx + ry
EQ Equal Z
MOV rx, ry rx = ry H CMP rx, #i8 rx − i∅
NE Not equal !Z
MOVS rx, ry rx = ry CMP rx, ry rx − ry H
CS/HS Carry set, Unsigned higher or same C
MOV{S} rx, #i8 rx = i∅ S MUL{S} rx, ry rx = rx × ry S
CC/LO Carry clear, Unsigned lower !C
MVN{S} rx, ry rx = ∼ry S RSB{S} rx, ry, #0 rx = 0 − ry S
MI Minus, Negative N
ORR{S} rx, ry rx = rx | ry S SBC{S} rx, ry rx = rx − (ry + C) S
PL Plus, Positive or zero !N
REV rx, ry rx = ry7:0 :ry15:8 :ry23:16 :ry31:24 6 SUB{S} rx, ry, #i3 rx = ry − i∅ S
VS Overflow V
VC No overflow !V REV16 rx, ry rx = ry23:16 :ry31:24 :ry7:0 :ry15:8 6 SUB{S} rx, #i8 rx = rx − i∅ S
HI Unsigned higher C & !Z REVSH rx, ry rx = ry±
7:0 :ry15:8 6 SUB{S} rx, ry, rz rx = ry − rz S
LS Unsigned lower or same !C | Z ROR{S} rx, ry rx = rx ≫ ry S SUB SP, #i9 SP = SP − i∅8:2 :01:0
GE Signed greater than or equal N=V SXTB rx, ry rx = ry±
7:0
GT Signed greater than !Z & N = V TST rx, ry rx & ry LDMIA rx{!}, rlist rlist = [rx]; if(!) rx += 4×cnt
LE Signed less than or equal Z | N 6= V UXTB rx, ry rx = ry∅7:0 6 LDMIA SP!, rlist rlist = [SP]; SP += 4×cnt
AL Always (default) 1 UXTH rx, ry rx = ry∅15:0 6 LDR rx, [ry{, #i7 }] rx = [ry + i∅6:2 :01:0 ]
LDR rx, [SP{, #i10 }] rx = [SP + i∅9:2 :01:0 ]
DMB and DSB Options Thumb16 Branch and Special Instructions LDR rx, rel10 rx = [PC + rel∅9:2 :01:0 ]
SY Full system, Read and write B rel12 PC = PC + rel±
11:1 :0 LDR rx, [ry, rz] rx = [ry + rz]
(SY)ST Full system, Write only Bcc rel9 if(cc) PC = PC + rel±
8:1 :0 I LDRB rx, [ry{, #i5 }] rx = [ry + i∅ ]∅8
ISH Inner shareable, Read and write BKPT #i8 BreakPoint(i) I LDRB rx, [ry, rz] rx = [ry + rz]∅8
ISHST Inner shareable, Write only BL rel23 LR=PC31:1 :1; PC+=rel±
22:1 :0 LDRH rx, [ry{, #i6 }] rx = [ry + i∅5:1 :0]∅16
NSH Non-shareable, Read and write BLX rel23 LR=PC31:1 :1; Set=0; PC+=rel±
22:2 :01:0 LDRH rx, [ry, rz] rx = [ry + rz]∅16
NSHST Non-shareable, Write only BLX rx LR=PC31:1 :1; Set=rx0 ; PC=rx31:1 :0 LDRSB rx, [ry, rz] rx = [ry + rz]±
8
OSH Outer shareable, Read and write BX rx Set=rx0 ; PC = rx31:1 :0 LDRSH rx, [ry, rz] rx = [ry + rz]±
16
OSHST Outer sharable, Write only CBNZ rx, rel7 if(rx 6= 0) PC += rel∅6:1 :0 I,6t POP rlist rlist = [SP]; SP += 4×cnt
CBZ rx, rel7 if(rx = 0) PC += rel∅6:1 :0 I,6t PUSH rlist SP −= 4×cnt; [SP] = rlist
Notes for Instruction Set
CPSI{D,E} {aif} {a}{i}{f} = (E ? 1 : 0) 6 STMIA rx!, rlist [rx] = rlist; rx += 4×cnt
6,6k,6t,7 Introduced in ARMv6, ARMv6k, ARMv6T2, or ARMv7
IT{t{t{t}}}cc if(cc) NextInstruction I,6t STMDB SP!, rlist SP −= 4×cnt; [SP] = rlist
A Only available in ARM mode
NOP 6k STR rx, [ry{, #i7 }] [ry + i∅6:2 :01:0 ] = rx
D Not available on ARM-M without DSP extension
SETEND {BE/LE} EndianState = {BE/LE} I,6 STR rx, [SP{, #i10 }] [SP + i∅9:2 :01:0 ] = rx
H Thumb16 instruction can use high registers
SEV SendEvent() 7 STR rx, [ry, rz] [ry + rz] = rx
I Can’t be conditional
SVC #i8 CallSupervisor() STRB rx, [ry{, #i5 }] [ry + i∅ ]8 = rx7:0
S Thumb16 instruction must have S suffix unless in IT block
T Only available in Thumb mode UDF #i8 UndefinedException() STRB rx, [ry, rz] [ry + rz]8 = rx7:0
WFE WaitForEvent() 7 STRH rx, [ry{, #i6 }] [ry + i∅5:1 :0]16 = rx15:0
WFI WaitForInterrupt() 7 STRH rx, [ry, rz] [ry + rz]16 = rx15:0
YIELD HintYield() 7
ARMv7 version 8 page 3
ARMv7-A & ARMv7-R System System Control Register (SCTLR) Secure Configuration Register (SCR)
M 0x00000001 MMU enabled B NS 0x001 System state is non-secure unless in Monitor mode
Current Program Status Register (CPSR) A 0x00000002 Alignment check enabled B IRQ 0x002 IRQs taken to Monitor mode
M 0x0000001f Processor Operating Mode C 0x00000004 Data and unified caches enabled B FIQ 0x004 FIQs taken to Monitor mode
T 0x00000020 Instruction set (JT: 00=ARM, 01=Thumb) CP15BEN 0x00000020 CP15 barrier enable 7,B EA 0x008 External aborts taken to Monitor mode
F 0x00000040 FIQ exception masked SW 0x00000400 Enable SWP and SWPB instructions 6,B FW 0x010 CPSR.F writeable in non-secure state
I 0x00000080 IRQ exception masked Z 0x00000800 Program flow prediction enabled B AW 0x020 CPSR.A writeable in non-secure state
A 0x00000100 Asynchronous abort masked 6 I 0x00001000 Instruction cache enabled B nET 0x040 Disable early termination
E 0x00000200 Big-endian operation 6 V 0x00002000 High exception vectors B SCD 0x080 Secure monitor call disable V
IT 0x0600fc00 IT state bits 6t RR 0x00004000 Round Robin select (Non-Secure RO) HCE 0x100 Hyp Call enable V
GE{3..0} 0x000f0000 SIMD Greater than or equal to 6 HA 0x00020000 Hardware access flag enable B,S SIF 0x200 Secure instruction fetch V
J 0x01000000 Instr set (JT: 10=Jazelle, 11=ThumbEE) 6 BR 0x00020000 Background region enable 7,R
Q 0x08000000 Cumulative saturation bit WXN 0x00080000 Write force to XN V Non-Secure Access Control Register (NSACR)
V 0x10000000 Overflow condition flag DZ 0x00080000 Divide by zero causes undefined instruction 7,R CP{0..13} 1 {0..13} CP{0..13} can be accessed in non-secure state
C 0x20000000 Carry condition flag UWXN 0x00100000 Unprivileged write forced to XN for PL1 V NSD32DIS 0x00004000 CPACR.D32DIS is fixed 1 in non-secure state
Z 0x40000000 Zero condition flag FI 0x00200000 Fast Interrupts (Non-Secure RO) 6 NSASEDIS 0x00008000 CPACR.ASEDIS is fixed 1 in non-secure state
N 0x80000000 Negative condition flag VE 0x01000000 Interrupt Vectors Enable 6,B RFR 0x00080000 Reserve FIQ mode for non-secure
EE 0x02000000 Exception Endianess 6,B NSTRCDIS 0x00100000 Disable non-secure access to CP14 trace regs
Processor Operating Modes
NMFI 0x08000000 Non-maskable FIQ support (RO) 6
usr 0x10 User CP15 Memory System Fault Registers
TRE 0x10000000 TEX remap functionality enabled B,S
fiq 0x11 FIQ DFSR c5,0,c0,0 Data Fault Status Register B
AFE 0x20000000 Access flag enable B,S
irq 0x12 IRQ IFSR c5,0,c0,1 Instruction Fault Status Register 6,B
TE 0x40000000 Thumb exception enable 6t,B
svc 0x13 Supervisor ADFSR c5,0,c1,0 Auxiliary DFSR 7,B
IE 0x80000000 Big-endian byte order in instructions 7,R
mon 0x16 Monitor (Secure only) S AIFSR c5,0,c1,1 Auxiliary IFSR 7,B
abt 0x17 Abort Coprocessor Access Control Register (CPACR) DFAR c6,0,c0,0 Data Fault Address Register B
hyp 0x1a Hypervisor (Non-secure only) V CP{0..13} 3(2×{0..13}) CP{0..13} access (00=denied, 01=privileged IFAR c6,0,c0,2 Instruction Fault Address Register 6,B
und 0x1b Undefined mode only, 11=privileged or user mode) DRBAR c6,0,c1,0 Data Region Base Address Register R
sys 0x1f System TRCDIS 0x10000000 Disable CP14 access to trace registers IRBAR c6,0,c1,1 Instruction Region Base Address Register R
D32DIS 0x40000000 Disable use of D16-D31 registers DRSR c6,0,c1,2 Data Region Size and Enable Register R
Vectors ASEDIS 0x80000000 Disable advanced SIMD functionality IRSR c6,0,c1,3 Instruction Region Size and Enable Register R
0x00 Reset DRACR c6,0,c1,4 Data Region Access Control Register R
0x04 Undefined instruction CP15 System Control Registers IRACR c6,0,c1,5 Instruction Region Access Control Register R
0x08 Supervisor Call / Secure Monitor Call / Hypervisor Call SCTLR c1,0,c0,0 System Control Register RGNR c6,0,c2,0 MPU Region Number Register R
0x0c Prefetch abort ACTLR c1,0,c0,1 Auxiliary Control Register 6,B
0x10 Data abort CPACR c1,0,c0,2 Coprocessor Access Control Register 6 CP15 Generic Timer Registers
0x14 Hyp trap SCR c1,0,c1,0 Secure Configuration (Secure only) S CNTFRQ c14,0,c0,0 Counter Frequency Reg (Non-Secure RO) 7
0x18 IRQ interrupt SDER c1,0,c1,1 Secure Debug Enable (Secure only) S CNTKCTL c14,0,c1,0 Timer PL1 Control Register 7
0x1c FIQ interrupt NSACR c1,0,c1,2 Non-Secure Access Control (Non-Secure RO) S CNTP TVAL c14,0,c2,0 PL1 Physical TimerValue Register 7,B
CNTP CTL c14,0,c2,1 PL1 Physical Timer Control Register 7,B
Notes for System Registers and Tables CP15 Security Extension Registers (ARM-A Only) CNTV TVAL c14,0,c3,0 Virtual TimerValue Register 7
6,6k,6t,7 Introduced in ARMv6, ARMv6k, ARMv6T2, or ARMv7 VBAR c12,0,c0,0 Vector Base Register B CNTV CTL c14,0,c3,1 Virtual TimerControl Register 7
A Only present on ARM-A MVBAR c12,0,c0,1 Monitor Vector Base Address (Secure only) CNTPCT c14,0 Physical Count Register (RO) 7
B Banked between secure and non-secure usage ISR c12,0,c1,0 Interrupt Status Register (RO) CNTVCT c14,1 Virtual Count Register (RO) 7
R Only present on ARM-R CNTP CVAL c14,2 PL1 Physical Timer CompareValue Register 7,B
S Only present with security extensions (Implies 6k,A) CNTV CVAL c14,3 Virtual Timer CompareValue Register 7
V Only present with virtualization extensions (Implies 7,A)