forked from IchigoJam/asm15
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patharmasm.html
342 lines (321 loc) · 13.9 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
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
<!DOCTYPE html><html><head><meta charset="utf-8">
<title>Cortex-M0 Armマシン語表 (asm15表記、抜粋)</title>
<meta property="og:image" content="armasm.png">
<link rel="icon" href="asm15.ico" sizes="16x16">
<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 th:last-child {
width: auto;
min-width: 4em;
}
.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;
}
.lastleft td:last-child {
text-align: left;
}
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 flags
Rd = u8 0 0 1 0 0 Rd u8 1 N Z
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 flags
Rd += u8 0 0 1 1 0 Rd u8 1 N Z C V
Rd -= u8 0 0 1 1 1 Rd u8 1 N Z C V
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 N Z C V
Rd = Rn - u3 0 0 0 1 1 1 1 u3 Rn Rd 1 N Z C V
Rd = Rn + Rm 0 0 0 1 1 0 0 Rm Rn Rd 1 N Z C V
Rd = Rn - Rm 0 0 0 1 1 0 1 Rm Rn Rd 1 N Z C V
Rd = -Rm 0 1 0 0 0 0 1 0 0 1 Rm Rd 1 N Z C V
Rd *= Rm 0 1 0 0 0 0 1 1 0 1 Rm Rd 1 N Z
Rd = Rm << u5 0 0 0 0 0 u5 Rm Rd 1 N Z C
Rd = Rm >> u5 0 0 0 0 1 u5 Rm Rd 1 N Z C
Rd <<= Rs 0 1 0 0 0 0 0 0 1 0 Rs Rd 1 N Z C
Rd >>= Rs 0 1 0 0 0 0 0 0 1 1 Rs Rd 1 N Z C
Rd = ~Rm 0 1 0 0 0 0 1 1 1 1 Rm Rd 1 N Z
Rd &= Rm 0 1 0 0 0 0 0 0 0 0 Rm Rd 1 N Z
Rd |= Rm 0 1 0 0 0 0 1 1 0 0 Rm Rd 1 N Z
Rd ^= Rm 0 1 0 0 0 0 0 0 0 1 Rm Rd 1 N Z
*/})
</script>
※Rd3とRd2-0の4bitでRdを指定する、Rd=PCの時3cycles<br>
※Rd=PC+u8: u8は4byte単位<br>
※シフト演算: シフト量が0のときはCフラグを変更しない<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 flags
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 flags
Rn - u8 0 0 1 0 1 Rn u8 1 N Z C V
Rn - Rm 0 1 0 0 0 1 0 1 Rn3 Rm Rn2-0 1 N Z C V
Rn - Rm 0 1 0 0 0 0 1 0 1 0 Rm Rn 1 N Z C V
Rn + Rm 0 1 0 0 0 0 1 0 1 1 Rm Rn 1 N Z C V
Rn & Rm 0 1 0 0 0 0 1 0 0 0 Rm Rn 1 N Z
*/})
</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 flags
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 flags
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 flags
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 N Z C
ASR Rd, Rs 0 1 0 0 0 0 0 1 0 0 Rs Rd 1 N Z C
BIC Rd, Rm 0 1 0 0 0 0 1 1 1 0 Rm Rd 1 N Z
ROR Rd, Rs 0 1 0 0 0 0 0 1 1 1 Rs Rd 1 N Z C
Rd += Rm + C 0 1 0 0 0 0 0 1 0 1 Rm Rd 1 N Z C V
Rd -= Rd + !C 0 1 0 0 0 0 0 1 1 0 Rm Rd 1 N Z C V
*/})
</script>
※BIC:ビットクリア、ASR:符号付き右シフト、ROR:右ローテート<br>
※REV:byteオーダー反転、REV16:byteオーダー反転(2byteずつ)、REVSH:符号付き16bitを反転32bit化<br>
※C:キャリーフラグ付き演算(ADC/SBC)<br>
※シフト/ローテート演算: シフト量が0のときはCフラグを変更しない<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 flags
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を進める 例)STM 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 flags
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 flags
NOP (=0) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 N Z
NOPF (=#46C0) 0 1 0 0 0 1 1 0 1 1 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 - -
DMB 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 4 -
- 1 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1 - -
DSB 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 4 -
- 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 - -
ISB 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 4 -
- 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 - -
Rd = spec_reg 1 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 4 -
- 1 0 0 0 Rd spec_reg - -
spec_reg = Rd 1 1 1 1 0 0 1 1 1 0 0 0 Rd 4 ※
- 1 0 0 0 1 0 0 0 spec_reg - -
*/})
</script>
※NOP:なにもしない(no operation) R0=R0<<0、NOPF: なにもしない(フラグも変化させない) R8=R8<br>
※CPSID:割込禁止、CPSIE:割込許可、WFI:割込待ち、SVC スーパーバイザーコール<br>
※SEV:イベント送信、WFE:イベント待ち、YIELD:NOPとして実行(?)<br>
※spec_reg:APSR/IPSR/EPSR/IEPSR/IAPSR/EAPSR/PSR/MSP/PSP/PRIMASK/CONTROL<br>
※APSRへの書き込みは、フラグを変更する<br>
※DMB:データメモリバリア、DSB:データ同期バリア、ISB:命令同期バリア<br>
<table id="tflags" class="tarmasm lastleft"></table>
<script>
makeTable("tflags", function() {/*
フラグの意味 flag set to 1 when...
符号 N 演算結果が負
ゼロ Z 演算結果が0
キャリー C 加算:オーバーフロー、減算:非負、シフト:該当ビットが1
オーバーフロー V 加減算の結果の符号が本来の結果と違う
*/})
</script>
<table id="tconds" class=tarmasm></table>
<script>
makeTable("tconds", function() {/*
分岐条件の意味 cond flags
一致/ゼロ EQ Z = 1
不一致/非ゼロ NE Z = 0
以上(符号なし) CS C = 1
未満(符号なし) CC C = 0
負 MI N = 1
非負 PL N = 0
オーバーフローあり VS V = 1
オーバーフローなし VC V = 0
超(符号なし) HI Z = 0 and C = 1
以下(符号なし) LS Z = 1 or C = 0
以上(符号あり) GE N = V
未満(符号あり) LT N != V
超(符号あり) GT Z = 0 and N = V
以下(符号あり) LE Z = 1 or N != V
無条件 AL -
*/})
</script>
<!--
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>),
<a href="https://www.nxp.com/docs/en/user-guide/UM10398.pdf">UN10398 LPC111x/LPC11Cxx User manual</a>,
<a href="http://www.coranac.com/files/gba/re-ejected-thumbref2.pdf">Thumb Cramsheet v2</a><br>
<a href="https://ichigojam.github.io/asm15/armasm.html">Original</a> Text: CC BY <a href=https://ichigojam.net/>ichigojam.net</a><br>
Modified By みけCAT<br>
Modification: <a href="https://creativecommons.org/licenses/by/4.0/deed.ja">CC BY 4.0</a> by みけCAT
<!--
【参考メモ】
『クリエイティブコモンズ・表示(CC BY)とは? #opendata / 福野泰介の一日一創 / Create every day by Taisuke Fukuno』
https://fukuno.jig.jp/216
に貼られている画像のURLに基づき、オリジナルのライセンスは3.0?
-->
</body></html>