ABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAEAFAGAHAIAJAKAL
1
Lower Memory AddressHigher Memory Address
2
AvailFmt15141312111098765432101514131211109876543210
3
Shift by Immediatev6-MB000opcodeimmediateRmRd
4
Add/Subtract Registerv6-MI000110opcRmRnRd=Available in ARMv6-M and up (e.g. M0, M0+, M1)
5
Add/Subtract Immediatev6-MK000111opcimmediateRnRd=Available in ARMv7-M and up (e.g. M3)
6
Add/subtract/move/compare immediate
v6-MD001opcodeRdimmediate=Available in ARMv7E-M (DSP extensions, e.g. M4)
7
Data Processing Registerv6-MQ010000opcodeRmRd
8
Special Data Processingv6-MN010001opcodeRd[3]RmRd[2:0]For floating point extensions (e.g. M4F), see FPv4-SP tab.
9
Branch / Exchangev6-MP01000111LRm(0)(0)(0)
10
Load literal (PC-relative)v6-ME01001RdimmediateThis depicts the complete set of binary instruction encodings available in M-profile processors as of this writing (summer 2014). This is derived from various public sources and my own experience, and is intended to fill a serious gap in ARM's documentation (they have not published a table of this form).

Related instructions are collapsed into a single row iff their operand fields and operation encoding can be described compactly, and they share standard assembly syntax. I've derived names for opcode bits where such names are clear. This encoding is very complex, for historical and space-efficiency reasons, so every pattern we can find helps.

Cells with a black triangle in the corner have notes. Mouse over the cell to view the notes.

If you're writing an assembler or disassembler, have a look at the format tabs below -- they provide a higher-level overview of the encodings.

Finally, if you're using an M0 or just getting started on an M3/M4, consider sticking to the v6m instruction set described on the next tab.
11
Load/store register indexedv6-MJ0101opcodeRmRnRd
12
Load/store word/byte displacementv6-MC011BLimmediateRnRd
13
Load/store halfword displacementv6-MC1000LimmediateRnRd
14
Load/store SP-relative displacementv6-ME1001LRdimmediate
15
Address generation from PC or SPv6-MF1010SPRdimmediate
16
Add to / subtract from SPv6-MO10110000Simmediate
17
Compare and branch if (non) zerov7-MT1011N0d61disp[5:1]Rn
18
Extend byte / halfwordv6-MQ10110010UBRmRd
19
PUSH and POPv6-ML1011L10Mreglist
20
CPSv6-MR10110110011E(0)(0)IF
21
Reverse Bytesv6-MQ10111010SHRmRd
22
Breakpointv6-MM10111110immediate
23
If-Thenv7-MU10111111firstmask
24
Hintv6-MS10111111opcode0000
25
Load/store multiplev6-MG1100LRnreglist
26
Conditional branchv6-MA1101ccdestination
27
Supervisor Callv6-MM11011111immediate
28
Unconditional Branchv6-MH11100destination
29
30
Branch and Linkv6-M111110Sdisp[21:12]1LJ21J1disp[11:1]
31
MSRv6-M211110011100(0)Rn10(0)0mask(0)(0)SYSm
32
MRSv6-M311110011111(0)(1)(1)(1)(1)10(0)0RdSYSm
33
Barrierv6-M4111100111011111110001111typescope
34
35
Load / Store multiplev7-M91110100order0WLRnreglist
36
Load / Store Doublev7-M101110100PU1WLRnRtRt2imm8Either P or W must be set.
37
Load / Store Exclusive Wordv7-M2511101000010LRnRt(1)(1)(1)(1)imm8Special case of double encoding where P==W==0
38
Load / Store Exclusive Byte / Halfwordv7-M3111101000110LRnRt(1)(1)(1)(1)010H(1)(1)(1)(1)
39
Table Branch Byte / Halfwordv7-M32111010001101Rn(1)(1)(1)(1)(0)(0)(0)(0)000HRm
40
Data processing, shifted registerv7-M161110101opcodeSRn(0)sh[4:2]Rdsh[1:0]typeRm
41
Pack Halfwordsv7E-M2011101010110(0)Rn(0)sh[4:2]Rdsh[1:0]tb(0)RmASR #0 cannot be encoded; operands must be flipped!
42
Data processing, modified immediatev7-M611110I0opcodeSRn0imm3Rdimm8
43
Data processing, plain 12-bit immediatev7-M711110i1110opcode0Rn0imm[10:8]Rdimm[7:0]
44
16-bit immediate movesv7-M811110i1110T100imm[15:12]0imm[10:8]Rdimm[7:0]
45
Word saturationv7-M1511110(0)11U0type0Rn0sh[4:2]Rdsh[1:0](0)sat
46
Halfword pair saturationv7E-M3011110(0)11U010Rn0000Rd00(0)(0)satASR 0 version of word saturation
47
Bitfield extractionv7-M2111110(0)11U100Rn0lsb[4:2]Rdlsb[1:0](0)widthm1
48
Bitfield insertionv7-M2211110(0)011100Rn0lsb[4:2]Rdlsb[1:0](0)msbit
49
Conditional branchv7-M511110Sccdisp[17:12]10J20J1disp[11:1]
50
Hintsv7-M35111100111010(1)(1)(1)(1)10(0)0(0)000hint kind
51
Barriersv7-M34111100111011(1)(1)(1)(1)10(0)0(1)(1)(1)(1)01barrieroption
52
CLREXv7-M35111100111011(1)(1)(1)(1)10(0)0(1)(1)(1)(1)0010(1)(1)(1)(1)
53
Load/Store single, wide displacementv7-M181111100S1sizeLRnRtimm12
54
Load/Store single, immediatev7-M191111100S0sizeLRnRt1PUWimm8Special combination P U !W indicates unprivileged access.
55
Load/Store unprivilegedv7-M251111100S0sizeLRnRt1110imm8
56
Load/Store single, registerv7-M261111100S0sizeLRnRt000000shiftRm
57
Register shiftv7-M14111110100typeSRn1111Rd0000Rm
58
Extendv7-M33111110100opcode11111111Rd1(0)rotateRm
59
Extend and Addv7E-M27111110100opcodeRn1111Rd1(0)rotateRm
60
Parallel add/subtract.v7E-M28111110101opcodeRn1111Rd0UmodeRm
61
Saturating word operations, SELv7E-M281111101010opc0Rn1111Rd10opcodeRm
62
Reversal, CLZv7-M291111101010opc1Rm1111Rd10opcodeRm
63
Multiplyv7-M28111110110000Rn1111Rd1000Rm
64
Multiply accumulate/subtractv7-M23111110110000RnRaRd100SRm
65
Extended 32/16-bit multiplicationv7E-M28111110110opcodeRn1111Rd10opcodeRm
66
Extended 32/16-bit multiply/accumulatev7E-M23111110110opcodeRnRaRd10opcodeRm
67
Long Multiplyv7-M24111110111AU0RnRdLoRdHi0000Rm
68
Divisionv7-M281111101110U1Rn(1)(1)(1)(1)Rd1111Rm
69
Long Multiply Extendedv7E-M24111110111opcodeRnRdLoRdHiopcodeRm
70
Coprocessor Dual Register Movev7-M17111C1100010RRt2RtcoprocopcodeCRmThese are the general, coprocessor-agnostic forms and are rarely used. Typically an assembler will define coprocessor-specific mnemonics and syntax that generate these forms. See the FPv4-SP encoding for one example (and the only example thus far supported on M-profile processors).
71
Coprocessor Data Processingv7-M12111C1110opc1CRnCRdcoprocopc20CRm
72
Coprocessor Single Register Movev7-M13111C1110opc1RCRnRtcoprocopc21CRm
73
Load/Store Coprocessorv7-M11111C110PUNWLRnCRdcoprocimm8