ARM Cortex-M
簡介 > 指令集

参见：ARM架構 § 指令集
Cortex-M0 / M0+ / M1實現的是ARMv6-M架構，Cortex-M3實現的是ARMv7-M架構，Cortex-M4 / Cortex-M7實現的是ARMv7E-M架構。Cortex-M23 / M33 / M35P實現的是ARMv8-M架構，Cortex-M55實現的是ARMv8.1-M架構。這些架構是二進制的指令碼，可以和ARMv6-M、 ARMv7-M、ARMv7E-M向上相容。Cortex-M0 / Cortex-M0+ / Cortex-M1的指令碼不用修改就可以在Cortex-M3 / Cortex-M4 / Cortex-M7上執行。Cortex-M3上可以執行的二進制程式碼不需修改就可以在Cortex-M4 / Cortex-M7 / Cortex-M33 / Cortex-M35P上執行。Cortex-M架構中支援Thumb-1和Thumb-2的指令集，不支援早期的32-bit ARM指令集。
所有Cortex-M的核心都有一個共通的指令子集，包括大部份Thumb-1指令、一些Thumb-2指令，以及結果為32位元的乘法。Cortex-M0 / Cortex-M0+ / Cortex-M1 / Cortex-M23設計目的就是希望讓矽晶面積最小，因此其指令集也是Cortex-M家族中最少的。
Cortex-M0 / M0+ / M1中有Thumb-1指令，不過沒有ARMv7-M架構才加入的指令（CBZ, CBNZ, IT）。Cortex-M0 / M0+ / M1包括一小部份的Thumb-2指令（BL, DMB, DSB, ISB, MRS, MSR）。Cortex-M3 / M4 / M7 / M33 / M35P 有所有基本的Thumb-1和Thumb-2指令。Cortex-M3加上了三個Thumb-1指令、所有的Thumb-2指令、硬體的整體除法、以及饱和运算指令。Cortex-M4加上了數位訊號處理（DSP）指令，以及可選的單精度浮点运算器（VFPv4-SP）。Cortex-M7加上了可選的雙精度浮点运算器（VFPv5）。Cortex-M23 / M33加上了TrustZone指令。
| Arm Core | Cortex M0 | Cortex M0+ | Cortex M1 | Cortex M3 | Cortex M4 | Cortex M7 | Cortex M23 | Cortex M33 | Cortex M35P | Cortex M55 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ARM架構 | ARMv6-M | ARMv6-M | ARMv6-M | ARMv7-M | ARMv7E-M | ARMv7E-M | ARMv8-M Baseline | ARMv8-M Mainline | ARMv8-M Mainline | Armv8.1-M |
| 计算机系统结构 | Von Neumann | Von Neumann | Von Neumann | Harvard | Harvard | Harvard | Von Neumann | Harvard | Harvard | Harvard |
| 指令管線化 | 3層 | 2層 | 3層 | 3層 | 3層 | 6層 | 2層 | 3層 | 3層 | 4到5層 |
| Thumb-1指令 | 大部份 | 大部份 | 大部份 | 全部 | 全部 | 全部 | 大部份 | 全部 | 全部 | 全部 |
| Thumb-2指令 | 部份 | 部份 | 部份 | 全部 | 全部 | 全部 | 部份 | 全部 | 全部 | 全部 |
乘法指令 32x32, 輸出32-bit: 是
| 乘法指令 32x32, 輸出64-bit | 否 | 否 | 否 | 是 | 是 | 是 | 否 | 是 | 是 | 是 |
| 除法指令 32/32，商32-bit | 否 | 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
| 饱和指令 | 否 | 否 | 否 | 部份 | 是 | 是 | 否 | 是 | 是 | 是 |
| DSP指令 instructions | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 可選 | 可選 | 可選 |
| 單精度浮點數（SP） 浮点运算指令 | 否 | 否 | 否 | 否 | 可選 | 可選 | 否 | 可選 | 可選 | 可選 |
| 雙精度浮點數（DP） 浮點指令 | 否 | 否 | 否 | 否 | 否 | 可選 | 否 | 否 | 否 | 可選 |
| 半精度（HP） | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 可選 |
| TrustZone指令 | 否 | 否 | 否 | 否 | 否 | 否 | 可選 | 可選 | 可選 | 可選 |
| 輔助處理器指令 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 可選 | 可選 | 可選 |
| Helium技術 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 可選 |
| 中斷延遲（英语：） （若用零等待狀態的RAM） | 16 cycles | 15 cycles | 23 for NMI 26 for IRQ | 12 cycles | 12 cycles | 12 cycles | 15 no security ext 27 security ext | TBD | TBD | TBD |
註：Cortex-M0／M0+／M1不包括以下16位元的Thumb-1指令：CBZ, CBNZ, IT。
註：Cortex-M0／M0+／M1只包括以下32位元的Thumb-2指令：BL, DMB, DSB, ISB, MRS, MSR.
註：Cortex-M0／M0+／M1／M23只有乘積結果為32位元的乘法指令（32bit × 32bit = lower 32bit），而Cortex-M3／M4／M7／M33／M35P有32位元相乘，結果為32位元的乘法指令（32bit × 32bit = 64bit）。Cortex-M4／M7（M33／M35P可選）包括DSP乘法指令 (16bit × 16bit = 32bit）、（32bit × 16bit = upper 32bi）、（32bit × 32bit = upper 32bit）ref name="ARMv6-M-Manual"/>
註：要計算完乘法及除法的週期數依ARM Cortex-M的核心設計而不同。有些核心有較快速度或是較小尺寸的矽智財選項，因此核心可能用較少的矽面積，但需要的週期數較長。在執行除法指令或慢速迭代乘法指令時發生的中斷會讓處理器放棄其指令，在中斷結束後再繼續。
Cortex-M0/M0+/M23中，結果為32位元的乘法可以選擇是1個週期或是32個週期。Cortex-M1可以選擇是3個週期或是33個週期。Cortex-M3/M4/M7/M33/M35P都是一個週期。.
Cortex-M3中，結果為32位元的乘法指令，可能是3–5個週期（視數值而定）。Cortex-M4/M7/M33/M35P是一個週期。
Cortex-M3/M4的除法指令是2–12個週期（視數值而定）。Cortex-M7是3–20個週期（視數值而定）。Cortex-M23有17個週期或34個週期的選項。Cortex-M33是2–11個週期（視數值而定）。Cortex-M35P的資料還不確定。
註：Cortex-M4 / M7 / M33 / M35P有不含FPU的矽智財選項，或是單精度（SP）的FPU，Cortex-M7加上第三個矽智財選項，可以支援單精度以及雙精度（DP）的FPU。若Cortex-M4 / M7 / M33 / M35P有FPU，其型號會是Cortex-M4F / Cortex-M7F / Cortex-M33F / Cortex-M35PF.。
註：Cortex-M系列包括三個新的16位元睡眠模式Thumb-1指令：SEV, WFE, WFI。
註：中斷延遲週期計數假設
1.堆疊放在零等待狀態RAM
2.沒有在執行其他的中斷
3.沒有安全延伸機能選項（因為會增加週期）
註：哈佛架構的Cortex-M，其中斷延遲週期計數會比較短。
| Group | Instr bits | Instructions | Cortex M0,M0+,M1 | Cortex M3 | Cortex M4 | Cortex M7 | Cortex M23 | Cortex M33,M35P | Cortex M55 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Thumb-1 | 16 | ADC, ADD, ADR, AND, ASR, B, BIC, BKPT, BLX, BX, CMN, CMP, CPS, EOR, LDM, LDR, LDRB, LDRH, LDRSB, LDRSH, LSL, LSR, MOV, MUL, MVN, NOP, ORR, POP, PUSH, REV, REV16, REVSH, ROR, RSB, SBC, SEV, STM, STR, STRB, STRH, SUB, SVC, SXTB, SXTH, TST, UXTB, UXTH, WFE, WFI, YIELD | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
| Thumb-1 | 16 | CBNZ, CBZ | 否 | 是 | 是 | 是 | 是 | 是 | 是 |
| Thumb-1 | 16 | IT | 否 | 是 | 是 | 是 | 否 | 是 | 是 |
| Thumb-2 | 32 | BL, DMB, DSB, ISB, MRS, MSR | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
| Thumb-2 | 32 | SDIV, UDIV | 否 | 是 | 是 | 是 | 是 | 是 | 是 |
| Thumb-2 | 32 | ADC, ADD, ADR, AND, ASR, B, BFC, BFI, BIC, CDP, CLREX, CLZ, CMN, CMP, DBG, EOR, LDC, LDM, LDR, LDRB, LDRBT, LDRD, LDREX, LDREXB, LDREXH, LDRH, LDRHT, LDRSB, LDRSBT, LDRSH, LDRSHT, LDRT, LSL, LSR, MCR, MCRR, MLA, MLS, MOV, MOVT, MRC, MRRC, MUL, MVN, NOP, ORN, ORR, PLD, PLDW, PLI, POP, PUSH, RBIT, REV, REV16, REVSH, ROR, RRX, RSB, SBC, SBFX, SEV, SMLAL, SMULL, SSAT, STC, STM, STR, STRB, STRBT, STRD, STREX, STREXB, STREXH, STRH, STRHT, STRT, SUB, SXTB, SXTH, TBB, TBH, TEQ, TST, UBFX, UMLAL, UMULL, USAT, UXTB, UXTH, WFE, WFI, YIELD | 否 | 是 | 是 | 是 | 否 | 是 | 是 |
| DSP | 32 | PKH, QADD, QADD16, QADD8, QASX, QDADD, QDSUB, QSAX, QSUB, QSUB16, QSUB8, SADD16, SADD8, SASX, SEL, SHADD16, SHADD8, SHASX, SHSAX, SHSUB16, SHSUB8, SMLABB, SMLABT, SMLATB, SMLATT, SMLAD, SMLALBB, SMLALBT, SMLALTB, SMLALTT, SMLALD, SMLAWB, SMLAWT, SMLSD, SMLSLD, SMMLA, SMMLS, SMMUL, SMUAD, SMULBB, SMULBT, SMULTT, SMULTB, SMULWT, SMULWB, SMUSD, SSAT16, SSAX, SSUB16, SSUB8, SXTAB, SXTAB16, SXTAH, SXTB16, UADD16, UADD8, UASX, UHADD16, UHADD8, UHASX, UHSAX, UHSUB16, UHSUB8, UMAAL, UQADD16, UQADD8, UQASX, UQSAX, UQSUB16, UQSUB8, USAD8, USADA8, USAT16, USAX, USUB16, USUB8, UXTAB, UXTAB16, UXTAH, UXTB16 | 否 | 否 | 是 | 是 | 否 | 可選 | 是 |
| 單精度浮點數 | 32 | VABS, VADD, VCMP, VCMPE, VCVT, VCVTR, VDIV, VLDM, VLDR, VMLA, VMLS, VMOV, VMRS, VMSR, VMUL, VNEG, VNMLA, VNMLS, VNMUL, VPOP, VPUSH, VSQRT, VSTM, VSTR, VSUB | 否 | 否 | 可選 | 可選 | 否 | 可選 | 可選 |
| 雙精度浮點數 | 32 | VCVTA, VCVTM, VCVTN, VCVTP, VMAXNM, VMINNM, VRINTA, VRINTM, VRINTN, VRINTP, VRINTR, VRINTX, VRINTZ, VSEL | 否 | 否 | 否 | 可選 | 否 | 否 | 可選 |
| TrustZone | 16 | BLXNS, BXNS | 否 | 否 | 否 | 否 | 可選 | 可選 | 可選 |
| TrustZone | 32 | SG, TT, TTT, TTA, TTAT | 否 | 否 | 否 | 否 | 可選 | 可選 | 可選 |
| 輔助處理器 | 16 | CDP, CDP2, MCR, MCR2, MCRR, MCRR2, MRC, MRC2, MRRC, MRRC2 | 否 | 否 | 否 | 否 | 否 | 可選 | 可選 |
註：針對Cortex-M4 / M7 / M33 / M35P，單精度（SP）浮點運算器指令只有在矽智財中有SP FPU選項時才有效。
註：針對Cortex-M7，雙精度（DP）浮點運算器指令只有在矽智財中有DP FPU選項時才有效。