Cortex-M0 Armマシン語表 (asm15、抜粋)

代入1514131211109876543210cycles
Rd = u800100Rdu81
Rd = Rm01000110Rd3RmRd2-01,3
※Rd3とRd2-0の4bitでRdを指定する、RdがPCの時3cycles
※Rd = Rm はフラグ変化なし(R0-R7で、Rd = Rm + 0 はフラグ変化する)
演算1514131211109876543210cycles
Rd += u800110Rdu81
Rd -= u800111Rdu81
Rd = PC + u810100Rdu81
Rd += Rm01000100Rd3RmRd2-01,3
Rd = Rn + u30001110u3RnRd1
Rd = Rn - u30001111u3RnRd1
Rd = Rn + Rm0001100RmRnRd1
Rd = Rn - Rm0001101RmRnRd1
Rd = -Rm0100001001RmRd1
Rd *= Rm0100001101RmRd1
Rd = Rm << u500000u5RmRd1
Rd = Rm >> u500001u5RmRd1
Rd <<= Rm0100000010RmRd1
Rd >>= Rm0100000011RmRd1
Rd = ~Rm0100001111RmRd1
Rd &= Rm0100000000RmRd1
Rd |= Rm0100001100RmRd1
Rd ^= Rm0100000001RmRd1
※Rd3とRd2-0の4bitでRdを指定する、Rd=PCの時3cycles
※Rd=PC+u8: u8は4byte単位
※Rd += Rm はフラグ変化なし(Rd = Rd + Rm はフラグ変化する)
メモリアクセス1514131211109876543210cycles
Rd = [Rn + u5]01111u5RnRd2
Rd = [Rn + u5]W10001u5RnRd2
Rd = [Rn + u5]L01101u5RnRd2
Rd = [PC + u8]L01001Rdu82
Rd = [Rn + Rm]0101110RmRnRd2
Rd = [Rn + Rm]C0101011RmRnRd2
Rd = [Rn + Rm]W0101101RmRnRd2
Rd = [Rn + Rm]S0101111RmRnRd2
Rd = [Rn + Rm]L0101100RmRnRd2
[Rn + u5] = Rd01110u5RnRd2
[Rn + u5]W = Rd10000u5RnRd2
[Rn + u5]L = Rd01100u5RnRd2
[Rn + Rm] = Rd0101010RmRnRd2
[Rn + Rm]W = Rd0101001RmRnRd2
[Rn + Rm]L = Rd0101000RmRnRd2
※[]後の記号でメモリサイズと符号を表す(W:2byte、L:4byte、C:符号付き1byte、S:符号付き2byte)
※u5/u8:Wの場合2byte単位、Lの場合4byte単位となる
条件判断1514131211109876543210cycles
Rn - u800101Rnu81
Rn - Rm01000101Rn3RmRn2-01
Rn - Rm0100001010RmRn1
Rn + Rm0100001011RmRn1
Rn & Rm0100001000RmRn1
※Rn3とRn2-0の4bitでRnを指定する
分岐1514131211109876543210cycles
IF 0 GOTO n811010000n81,3
IF !0 GOTO n811010001n81,3
IF cond GOTO n81101condn81,3
GOTO n1111100n113
GOTO Rm010001110Rm0003
GOSUB Rm010001111Rm0003
GOSUB n2211110n22(21-11)1
-11111n22(10-0)3
RET (=#4770)01000111011100003
※n8/n11/n22:飛び先との命令数の差分から-2した数を指定、分岐するとき3cycles
※cond:0-14 (EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL) !を付けて否定
スタック1514131211109876543210cycles
PUSH {regs}1011010LRR7R6R5R4R3R2R1R01+N
POP {regs}1011110PCR7R6R5R4R3R2R1R01,4 +N
SP += u7101100000u71
SP -= u7101100001u71
Rd = SP + u810101Rdu81
Rd = [SP + u8]L10011Rdu82
[SP + u8]L = Rd10010Rdu82
※u7/u8:4byte単位
※PUSH:regsの大きいレジスタから順に、SPを減らしSPへ積む 例)PUSH {R1,R2}
※POP:regsの小さいレジスタから順に、SPから読み込みSPを増やす 例)POP {R1,R2}
※N:指定したレジスタの数、PCへPOPした場合4+Ncycles(それ以外は1+Ncycles)
特殊演算1514131211109876543210cycles
Rd = REV(Rm)1011101000RmRd1
Rd = REV16(Rm)1011101001RmRd1
Rd = REVSH(Rm)1011101011RmRd1
Rd = ASR(Rm, u5)00010u5RmRd1
ASR Rd, Rm0100000100RmRd1
BIC Rd, Rm0100001110RmRd1
ROR Rd, Rm0100000111RmRd1
Rd += Rm + C0100000101RmRd1
Rd -= Rd + !C0100000110RmRd1
※BIC:ビットクリア、ASR:符号付き右シフト、ROR:右ローテート
※REV:byteオーダー反転、REV16:byteオーダー反転(2byteずつ)、REVSH:符号付き16bitを反転32bit化
※C:キャリーフラグ付き演算(ADC/SBC)
メモリアクセス21514131211109876543210cycles
LDM Rn, {regs}11001RnR7R6R5R4R3R2R1R01+N
STM Rn, {regs}11000RnR7R6R5R4R3R2R1R01+N
※N:指定したレジスタの数(マルチメモリアクセス)
※LDM:アドレスRnからregsの小さいレジスタから順に読み込みRnを進める 例)LDM R0,{R1,R2}
※STM:アドレスRnへregsの小さいレジスタから順に書き込みRnを進める 例)LDM R0,{R1,R2}
符号拡張1514131211109876543210cycles
Rd = SXTH(Rm)1011001000RmRd1
Rd = SXTB(Rm)1011001001RmRd1
Rd = UXTH(Rm)1011001010RmRd1
Rd = UXTB(Rm1011001011RmRd1
※ SXTH(16→32bit shortへのキャスト)、SXTB(8→32bit charへのキャスト)、UXTH(16→32bit、ゼロ拡張)、UXTB(8→32bit、ゼロ拡張)
その他1514131211109876543210cycles
NOP (=0)00000000000000001
CPSID (=#B672)10110110011100101
CPSIE (=#B662)10110110011000101
WFI (=#BF30)10111111001100002
YIELD10111111000100001
WFE10111111001000002
SEV10111111010000001
SVC11011111u8-
BKPT10111110u8-
※CPSID:割込禁止、CPSIE:割込許可、WFI:割込待ち、NOP:なにもしない(no operation) R0=R0<<0、SVC スーパーバイザーコール

- マシン語関連ツール
IchigoJam web - マシン語対応
asm15 - Assembler for IchigoJam
cpuemu15 - IchigoJam マシン語エミュレーター alpha1 (説明)
armasm.pdf - このドキュメントのPDF版
RV32C RISC-Vマシン語表(asm15r)

- 連載、IchigoJamではじめる、Armマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語
8. アセンブラを使って楽しよう
9. マシン語で高速SPI
10. マシン語を制するもの時間を制す
11. 画面をイチゴで埋め尽くす12の方法
12. レジスタ不足に上位レジスタとスタック操作
13. コンパイラはじめのいっぽ、EVAL実現法とマシン語生成
14. サイズを取るかスピードを取るか、割り算のアルゴリズムとマシン語実装
15. マシン語化で1万倍速!? セットで学ぶアルゴリズムとコンピューター
16. フラグ活用テクニック、オールマシン語74byteで作る「かわくだりゲーム」

DATA: Cortex-M0プロセッサ - Arm (cycles)
Text: CC BY ichigojam.net