-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy patharmasm.html
271 lines (254 loc) · 10.8 KB
/
armasm.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
<!DOCTYPE html><html><head><meta charset="utf-8">
<title>Cortex-M0 Armマシン語表 (asm15表記、抜粋)</title>
<meta property="og:image" content="armasm.png">
<link rel="apple-touch-icon" href="armasm.png"/>
<script src=lib/maketable2.js></script>
<style>
body {
font-family: sans-serif;
}
.tarmasm {
border-collapse: collapse;
page-break-inside: avoid;
}
.tarmasm th {
width: 2em;
border: 1px solid black;
font-size: 92%;
}
.tarmasm {
margin-top: .5em;
}
.tarmasm th:first-child {
width: 9em;
text-align: left;
border: none;
}
.tarmasm td {
text-align: center;
font-size: 92%;
border: 1px solid black;
}
.tarmasm td:first-child {
text-align: left;
padding-left: 3px;
border: 1px solid black;
}
a {
color: gray !important;
}
</style>
</head><body>
<h1>Cortex-M0 Armマシン語表 (asm15、抜粋)</h1>
<table id="t1188a" class=tarmasm></table>
<script>
makeTable("t1188a", function() {/*
代入 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
Rd = u8 0 0 1 0 0 Rd u8 1
Rd = Rm 0 1 0 0 0 1 1 0 Rd3 Rm Rd2-0 1,3
*/})
</script>
※Rd3とRd2-0の4bitでRdを指定する、RdがPCの時3cycles<br>
※Rd = Rm はフラグ変化なし(R0-R7で、Rd = Rm + 0 はフラグ変化する)
<table id="t1188b" class=tarmasm></table>
<script>
makeTable("t1188b", function() {/*
演算 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
Rd += u8 0 0 1 1 0 Rd u8 1
Rd -= u8 0 0 1 1 1 Rd u8 1
Rd = PC + u8 1 0 1 0 0 Rd u8 1
Rd += Rm 0 1 0 0 0 1 0 0 Rd3 Rm Rd2-0 1,3
Rd = Rn + u3 0 0 0 1 1 1 0 u3 Rn Rd 1
Rd = Rn - u3 0 0 0 1 1 1 1 u3 Rn Rd 1
Rd = Rn + Rm 0 0 0 1 1 0 0 Rm Rn Rd 1
Rd = Rn - Rm 0 0 0 1 1 0 1 Rm Rn Rd 1
Rd = -Rm 0 1 0 0 0 0 1 0 0 1 Rm Rd 1
Rd *= Rm 0 1 0 0 0 0 1 1 0 1 Rm Rd 1
Rd = Rm << u5 0 0 0 0 0 u5 Rm Rd 1
Rd = Rm >> u5 0 0 0 0 1 u5 Rm Rd 1
Rd <<= Rm 0 1 0 0 0 0 0 0 1 0 Rm Rd 1
Rd >>= Rm 0 1 0 0 0 0 0 0 1 1 Rm Rd 1
Rd = ~Rm 0 1 0 0 0 0 1 1 1 1 Rm Rd 1
Rd &= Rm 0 1 0 0 0 0 0 0 0 0 Rm Rd 1
Rd |= Rm 0 1 0 0 0 0 1 1 0 0 Rm Rd 1
Rd ^= Rm 0 1 0 0 0 0 0 0 0 1 Rm Rd 1
*/})
</script>
※Rd3とRd2-0の4bitでRdを指定する、Rd=PCの時3cycles<br>
※Rd=PC+u8: u8は4byte単位<br>
※Rd += Rm はフラグ変化なし(Rd = Rd + Rm はフラグ変化する)
<table id="t1479a" class=tarmasm></table>
<script>
makeTable("t1479a", function() {/*
メモリアクセス 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
Rd = [Rn + u5] 0 1 1 1 1 u5 Rn Rd 2
Rd = [Rn + u5]W 1 0 0 0 1 u5 Rn Rd 2
Rd = [Rn + u5]L 0 1 1 0 1 u5 Rn Rd 2
Rd = [PC + u8]L 0 1 0 0 1 Rd u8 2
Rd = [Rn + Rm] 0 1 0 1 1 1 0 Rm Rn Rd 2
Rd = [Rn + Rm]C 0 1 0 1 0 1 1 Rm Rn Rd 2
Rd = [Rn + Rm]W 0 1 0 1 1 0 1 Rm Rn Rd 2
Rd = [Rn + Rm]S 0 1 0 1 1 1 1 Rm Rn Rd 2
Rd = [Rn + Rm]L 0 1 0 1 1 0 0 Rm Rn Rd 2
[Rn + u5] = Rd 0 1 1 1 0 u5 Rn Rd 2
[Rn + u5]W = Rd 1 0 0 0 0 u5 Rn Rd 2
[Rn + u5]L = Rd 0 1 1 0 0 u5 Rn Rd 2
[Rn + Rm] = Rd 0 1 0 1 0 1 0 Rm Rn Rd 2
[Rn + Rm]W = Rd 0 1 0 1 0 0 1 Rm Rn Rd 2
[Rn + Rm]L = Rd 0 1 0 1 0 0 0 Rm Rn Rd 2
*/})
</script>
※[]後の記号でメモリサイズと符号を表す(W:2byte、L:4byte、C:符号付き1byte、S:符号付き2byte)<br>
※u5/u8:Wの場合2byte単位、Lの場合4byte単位となる<br>
<table id="t1188c" class=tarmasm></table>
<script>
makeTable("t1188c", function() {/*
条件判断 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
Rn - u8 0 0 1 0 1 Rn u8 1
Rn - Rm 0 1 0 0 0 1 0 1 Rn3 Rm Rn2-0 1
Rn - Rm 0 1 0 0 0 0 1 0 1 0 Rm Rn 1
Rn + Rm 0 1 0 0 0 0 1 0 1 1 Rm Rn 1
Rn & Rm 0 1 0 0 0 0 1 0 0 0 Rm Rn 1
*/})
</script>
※Rn3とRn2-0の4bitでRnを指定する
<table id="t1188d" class=tarmasm></table>
<script>
makeTable("t1188d", function() {/*
分岐 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
IF 0 GOTO n8 1 1 0 1 0 0 0 0 n8 1,3
IF !0 GOTO n8 1 1 0 1 0 0 0 1 n8 1,3
IF cond GOTO n8 1 1 0 1 cond n8 1,3
GOTO n11 1 1 1 0 0 n11 3
GOTO Rm 0 1 0 0 0 1 1 1 0 Rm 0 0 0 3
GOSUB Rm 0 1 0 0 0 1 1 1 1 Rm 0 0 0 3
GOSUB n22 1 1 1 1 0 n22(21-11) 1
- 1 1 1 1 1 n22(10-0) 3
RET (=#4770) 0 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 3
*/})
/*
本来はn24だけど、n22としておく、n22からn24に拡張された後がある
CALL n24 << 1 1 1 1 1 0 S n24(20-11) -
- 1 1 J1 1 J2 n24(10-0) 4
*/
</script>
※n8/n11/n22:飛び先との命令数の差分から-2した数を指定、分岐するとき3cycles<br>
※cond:0-14 (EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL) !を付けて否定<br>
<table id="t1479b" class=tarmasm></table>
<script>
makeTable("t1479b", function() {/*
スタック 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
PUSH {regs} 1 0 1 1 0 1 0 LR R7 R6 R5 R4 R3 R2 R1 R0 1+N
POP {regs} 1 0 1 1 1 1 0 PC R7 R6 R5 R4 R3 R2 R1 R0 1,4 +N
SP += u7 1 0 1 1 0 0 0 0 0 u7 1
SP -= u7 1 0 1 1 0 0 0 0 1 u7 1
Rd = SP + u8 1 0 1 0 1 Rd u8 1
Rd = [SP + u8]L 1 0 0 1 1 Rd u8 2
[SP + u8]L = Rd 1 0 0 1 0 Rd u8 2
*/})
</script>
※u7/u8:4byte単位<br>
※PUSH:regsの大きいレジスタから順に、SPを減らしSPへ積む 例)PUSH {R1,R2}<br>
※POP:regsの小さいレジスタから順に、SPから読み込みSPを増やす 例)POP {R1,R2}<br>
※N:指定したレジスタの数、PCへPOPした場合4+Ncycles(それ以外は1+Ncycles)<br>
<table id="t1188b2" class=tarmasm></table>
<script>
makeTable("t1188b2", function() {/*
特殊演算 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
Rd = REV(Rm) 1 0 1 1 1 0 1 0 0 0 Rm Rd 1
Rd = REV16(Rm) 1 0 1 1 1 0 1 0 0 1 Rm Rd 1
Rd = REVSH(Rm) 1 0 1 1 1 0 1 0 1 1 Rm Rd 1
Rd = ASR(Rm, u5) 0 0 0 1 0 u5 Rm Rd 1
ASR Rd, Rm 0 1 0 0 0 0 0 1 0 0 Rm Rd 1
BIC Rd, Rm 0 1 0 0 0 0 1 1 1 0 Rm Rd 1
ROR Rd, Rm 0 1 0 0 0 0 0 1 1 1 Rm Rd 1
Rd += Rm + C 0 1 0 0 0 0 0 1 0 1 Rm Rd 1
Rd -= Rd + !C 0 1 0 0 0 0 0 1 1 0 Rm Rd 1
*/})
</script>
※BIC:ビットクリア、ASR:符号付き右シフト、ROR:右ローテート<br>
※REV:byteオーダー反転、REV16:byteオーダー反転(2byteずつ)、REVSH:符号付き16bitを反転32bit化<br>
※C:キャリーフラグ付き演算(ADC/SBC)<br>
<table id="t1479d" class=tarmasm></table>
<script>
makeTable("t1479d", function() {/*
メモリアクセス2 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
LDM Rn, {regs} 1 1 0 0 1 Rn R7 R6 R5 R4 R3 R2 R1 R0 1+N
STM Rn, {regs} 1 1 0 0 0 Rn R7 R6 R5 R4 R3 R2 R1 R0 1+N
*/})
</script>
※N:指定したレジスタの数(マルチメモリアクセス)<br>
※LDM:アドレスRnからregsの小さいレジスタから順に読み込みRnを進める 例)LDM R0,{R1,R2}<br>
※STM:アドレスRnへregsの小さいレジスタから順に書き込みRnを進める 例)LDM R0,{R1,R2}<br>
<table id="t1479c" class=tarmasm></table>
<script>
makeTable("t1479c", function() {/*
符号拡張 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
Rd = SXTH(Rm) 1 0 1 1 0 0 1 0 0 0 Rm Rd 1
Rd = SXTB(Rm) 1 0 1 1 0 0 1 0 0 1 Rm Rd 1
Rd = UXTH(Rm) 1 0 1 1 0 0 1 0 1 0 Rm Rd 1
Rd = UXTB(Rm 1 0 1 1 0 0 1 0 1 1 Rm Rd 1
*/})
</script>
※ SXTH(16→32bit shortへのキャスト)、SXTB(8→32bit charへのキャスト)、UXTH(16→32bit、ゼロ拡張)、UXTB(8→32bit、ゼロ拡張)
<table id="t1479e" class=tarmasm></table>
<script>
makeTable("t1479e", function() {/*
その他 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 cycles
NOP (=0) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
CPSID (=#B672) 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1
CPSIE (=#B662) 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 0 1
WFI (=#BF30) 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 2
YIELD 1 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1
WFE 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 2
SEV 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1
SVC 1 1 0 1 1 1 1 1 u8 -
BKPT 1 0 1 1 1 1 1 0 u8 -
*/})
</script>
※CPSID:割込禁止、CPSIE:割込許可、WFI:割込待ち、NOP:なにもしない(no operation) R0=R0<<0、SVC スーパーバイザーコール<br>
<!--
todo
分岐の種類を増やす
データバリアを追加
DMB(t2), DSB(t2), ISB(t2) -- data barrier
特殊アドレスを追加
MRS(t2) 特殊アドレス読込, MSR(t2) 特殊アドレスへ書き込み
APSR IAPSR EAPSR XPSR IPSR EPSR IEPSR MSP PSP PRIMASK CONTROL
-->
</p><p>
- マシン語関連ツール<br>
<a href=https://fukuno.jig.jp/app/IchigoJam/>IchigoJam web - マシン語対応</a><br>
<a href=index.html>asm15</a> - Assembler for IchigoJam<br>
<a href=cpuemu.html>cpuemu15</a> - IchigoJam マシン語エミュレーター alpha1 (<a href="http://fukuno.jig.jp/1328">説明</a>)<br>
<a href=armasm.pdf>armasm.pdf</a> - このドキュメントのPDF版<br>
<a href=rvasm.html>RV32C RISC-Vマシン語表(asm15r)</a><br>
</p><p>
- 連載、IchigoJamではじめる、Armマシン語入門<br>
<a href=https://fukuno.jig.jp/1184>1. はじめてのマシン語</a><br>
<a href=https://fukuno.jig.jp/1186>2. ハンドアセンブルで超速計算!</a><br>
<a href=https://fukuno.jig.jp/1188>3. マシン語メモリアクセスで画面超速表示!</a><br>
<a href=https://fukuno.jig.jp/1476>4. マシン語でLEDを光らせよう!</a><br>
<a href=https://fukuno.jig.jp/1479>5. 楽しさ広がるマルチバイトメモリアクセスとスタック</a><br>
<a href=https://fukuno.jig.jp/1484>6. マシン語使いこなしTIPS</a><br>
<a href=https://fukuno.jig.jp/1485>7. カジュアルに使うインラインマシン語</a><br>
<a href=https://fukuno.jig.jp/1757>8. アセンブラを使って楽しよう</a><br>
<a href=https://fukuno.jig.jp/1849>9. マシン語で高速SPI</a><br>
<a href=https://fukuno.jig.jp/1872>10. マシン語を制するもの時間を制す</a><br>
<a href=https://fukuno.jig.jp/1889>11. 画面をイチゴで埋め尽くす12の方法</a><br>
<a href=https://fukuno.jig.jp/2035>12. レジスタ不足に上位レジスタとスタック操作</a><br>
<a href=https://fukuno.jig.jp/2493>13. コンパイラはじめのいっぽ、EVAL実現法とマシン語生成</a><br>
<a href=https://fukuno.jig.jp/2494>14. サイズを取るかスピードを取るか、割り算のアルゴリズムとマシン語実装</a><br>
<a href=https://fukuno.jig.jp/2495>15. マシン語化で1万倍速!? セットで学ぶアルゴリズムとコンピューター</a><br>
<a href=https://fukuno.jig.jp/2942>16. フラグ活用テクニック、オールマシン語74byteで作る「かわくだりゲーム」</a><br>
<!--
クロックを意識して特殊演算
4byte rotate
条件分岐キャリー
まとめてload/store
関数(除算)
-->
</p><p>
DATA: <a href=https://www.arm.com/ja/products/processors/cortex-m/cortex-m0.php>Cortex-M0プロセッサ - Arm</a> (<a href=http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0432c/CHDCICDF.html>cycles</a>)<br>
Text: CC BY <a href=https://ichigojam.net/>ichigojam.net</a><br>
</body></html>