Cortex-M0 ARMマシン語表(抜粋)

代入1514131211109876543210cyclesflag
Rd = u800100Rdu81
Rd = Rm0100011000RmRd1
Rd = Rm01000110Rd3RmRd2-01 or 3
※Rd3とRd2-0の4bitでRdを指定する、Rd=PCの時3cycles
演算1514131211109876543210cycles
Rd = Rd + u800110Rdu81
Rd = Rd - u800111Rdu81
Rd = Rm << u500000u5RmRd1
Rd = Rm >> u500001u5RmRd1
Rd = Rn + Rm0001100RmRnRd1
Rd = Rd + Rm01000100Rd3RmRd2-01 or 3
Rd = Rn - Rm0001101RmRnRd1
Rd = Rn + u30001110u3RnRd1
Rd = Rn - u30001111u3RnRd1
Rd = Rd & Rm0100000000RmRd1
Rd = Rd ^ Rm0100000001RmRd1
Rd = Rd << Rm0100000010RmRd1
Rd = Rd >> Rm0100000011RmRd1
Rd = -Rm0100001001RmRd1
Rd = Rd | Rm0100001100RmRd1
Rd = Rd * Rm0100001101RmRd1
Rd = ~Rm0100001111RmRd1
※Rd3とRd2-0の4bitでRdを指定する、Rd=PCの時3cycles
メモリアクセス1514131211109876543210cycles
Rd = [Rn + u5]01111u5RnRd2
Rd = [Rn + u5]210001u5/2RnRd2
Rd = [Rn + u5]401101u5/4RnRd2
[Rn + u5] = Rd01110u5RnRd2
[Rn + u5]2 = Rd10000u5/2RnRd2
[Rn + u5]4 = Rd01100u5/4RnRd2
Rd = [Rn + Rm]0101110RmRnRd2
Rd = [Rn + Rm]20101101RmRnRd2
Rd = [Rn + Rm]40101100RmRnRd2
[Rn + Rm] = Rd0101010RmRnRd2
[Rn + Rm]2 = Rd0101001RmRnRd2
[Rn + Rm]4 = Rd0101000RmRnRd2

条件判断1514131211109876543210cycles
Rn - u800101Rnu81
Rn - Rm0100001010RmRn1
Rn - Rm01000101Rn3RmRn2-01
Rn + Rm0100001011RmRn1
Rn & Rm0100001000RmRn1
※CMPHは、RdがR8-R15の場合に使用(正規のニモニックではありません)
分岐1514131211109876543210cycles
IF 0 GOTO n8 << 111010000n81 or 3
IF !0 GOTO n8 << 111010001n81 or 3
GOTO n11 << 111100n113
GOTO Rm010001110Rm0003
RET (=#4770)01000111011100003
CALL Rm010001111Rm0003
※条件コードのうち、GE,LT,GT,LEは符号付き
※GOTOに指定する値(n8/n11)は飛び先との命令数差分から-2した数を指定、分岐するとき3cycles
スタック1514131211109876543210cycles
PUSH regs1011010LRR7R6R5R4R3R2R1R01+N
POP regs1011110PCR7R6R5R4R3R2R1R01+N
※N:指定したレジスタの数、例)PUSH {R5,R4,R3}
特殊演算1514131211109876543210cycles
Rd = bic(Rd, Rm)0100001110RmRd1
Rd = asr(Rm, u5)00010u5RmRd1
Rd = asr(Rd, Rm)0100000100RmRd1
Rd = ror(Rd, Rm)0100000111RmRd1
Rd = rev(Rm)1011101000RmRd1
Rd = rev16(Rm)1011101001RmRd1
Rd = revSH(Rm)1011101011RmRd1
Rd = adc(Rd, Rm)0100000101RmRd1
Rd = sbc(Rd, Rm)0100000110RmRd1
※bic:ビットクリア、asr:符号付き右シフト、ror:右ローテート
※rev:byteオーダー反転、rev16:byteオーダー反転(2byteずつ)、revSH:符号付き16bitを反転32bit化
※abc:キャリー付き足し算、sbc:キャリー付き引き算
その他1514131211109876543210cycles
CPSID (=#B672)10110110011100101
CPSIE (=#B662)10110110011000101
WFI (=#BF30)10111111001100002
NOP (=0)00000000000000001
※CPSID:割込禁止、CPSIE:割込許可、WIF:割込待ち、NOP:なにもしない(no operation) R0=R0<<0
※flag列は、命令の実行結果に基づいて条件コードフラグの更新の有無を表します。(*:変化/-:無変化)

- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語

DATA: Cortex-M0プロセッサ - ARM
Text: CC BY ichigojam.net