forked from IchigoJam/asm15
-
Notifications
You must be signed in to change notification settings - Fork 1
/
rvasm.html
373 lines (353 loc) · 13.1 KB
/
rvasm.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
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
<!DOCTYPE html><html><head><meta charset="utf-8">
<title>RV32C RISC-Vマシン語表 (asm15r、抜粋)</title>
<meta property="og:image" content="rvasm.png">
<link rel="apple-touch-icon" href="rvasm.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: 13em;
text-align: left;
border: none;
}
.tarmasm th:last-child {
width: 5em;
}
.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;
}
.tarmasm tr.upper {
background-color: #ddd;
}
a {
color: gray !important;
}
</style>
</head><body>
<h1>RV32C RISC-Vマシン語表 (asm15r、抜粋)</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 op
Rd = n6 0 1 0 n5 Rd n4-0 0 1 c.li
Rd = n18 0 1 1 n17 Rd n16-12 0 1 c.lui
Rd = Rm 1 0 0 0 Rd Rm 1 0 c.mv
*/})
</script>
※RdはR0以外、R0=0固定<br>
※n18の下位12ビットは0固定<br>
<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 op
Rd += n6 0 0 0 n5 Rd n4-0 0 1 c.addi
Rd <<= u5 0 0 0 0 Rd u4-0 1 0 c.slli
Rd += Rm 1 0 0 1 Rd Rm 1 0 c.add
Rd' >>= u5 1 0 0 0 0 0 Rd' u4-0 0 1 c.srli
Rd' >>>= u5 1 0 0 0 0 1 Rd' u4-0 0 1 c.srai
Rd' &= n6 1 0 0 n5 1 0 Rd' n4-0 0 1 c.andi
Rd' -= Rm' 1 0 0 0 1 1 Rd' 0 0 Rm' 0 1 c.sub
Rd' ^= Rm' 1 0 0 0 1 1 Rd' 0 1 Rm' 0 1 c.xor
Rd' |= Rm' 1 0 0 0 1 1 Rd' 1 0 Rm' 0 1 c.or
Rd' &= Rm' 1 0 0 0 1 1 Rd' 1 1 Rm' 0 1 c.and
*/})
</script>
※Rd' = R(d+8) (3bitでR8-R15を指定)<br>
※ >> : 符号なし右シフト、>>> : 符号付き右シフト<br>
<table id="t1188c" class=tarmasm></table>
<script>
makeTable("t1188c", function() {/*
M拡張演算 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 op
Rd = Rm * Rs Rm0 0 0 0 Rd 0 1 1 0 0 1 1 mul
0 0 0 0 0 0 1 Rs Rm4-1 -
Rd = Rm / Rs Rm0 1 0 0 Rd 0 1 1 0 0 1 1 div
0 0 0 0 0 0 1 Rs Rm4-1 -
Rd = Rm % Rs Rm0 1 1 0 Rd 0 1 1 0 0 1 1 rem
0 0 0 0 0 0 1 Rs Rm4-1 -
Rd = MULH(Rm, Rs) Rm0 0 0 1 Rd 0 1 1 0 0 1 1 mulh
0 0 0 0 0 0 1 Rs Rm4-1 -
Rd = MULHSU(Rm, Rs) Rm0 0 1 0 Rd 0 1 1 0 0 1 1 mulhsu
0 0 0 0 0 0 1 Rs Rm4-1 -
Rd = MULHU(Rm, Rs) Rm0 0 1 1 Rd 0 1 1 0 0 1 1 mulhu
0 0 0 0 0 0 1 Rs Rm4-1 -
Rd = DIVU(Rm, Rs) Rm0 1 0 1 Rd 0 1 1 0 0 1 1 divu
0 0 0 0 0 0 1 Rs Rm4-1 -
Rd = REMU(Rm, Rs) Rm0 1 1 1 Rd 0 1 1 0 0 1 1 remu
0 0 0 0 0 0 1 Rs Rm4-1 -
*/})
</script>
※mul/div/remにC命令なし<br>
※MULH:乗算結果の上位, MULHSU:符号付きRm×符号なしRsの上位, MULHU:符号なし乗算結果の上位<br>
※DIVU:符号なし除算, REU:符号なし剰余
<br>
<!--
Armから無い
?Rd = PC + u8 1 0 1 0 0 Rd u8 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
-->
<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 op
Rd' = [Rn' + u7]L 0 1 0 u5-3 Rn' u2 u6 Rd' 0 0 c.lw
[Rn' + u7]L = Rd' 1 1 0 u5-3 Rn' u2 u6 Rd' 0 0 c.sw
*/})
</script>
※[]後の記号でメモリサイズと符号を表す(W:2byte、L:4byte、C:符号付き1byte、S:符号付き2byte)<br>
※u7:1byte単位のオフセット (4の倍数でなければならない)<br>
<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 op
IF !Rs' GOTO n9 1 1 0 n8 n4-3 Rs' n7-6 n2-1 n5 0 1 c.beqz
IF Rs' GOTO n9 1 1 1 n8 n4-3 Rs' n7-6 n2-1 n5 0 1 c.bnez
GOTO n12 1 0 1 n11 n4 n9-8 n10 n6 n7 n3-1 n5 0 1 c.j
GOTO Rs 1 0 0 0 Rs 0 0 0 0 0 1 0 c.jr
GOSUB n12 0 0 1 n11 n4 n9-8 n10 n6 n7 n3-1 n5 0 1 c.jal
GOSUB Rs 1 0 0 1 Rs 0 0 0 0 0 1 0 c.jalr
RET (=GOTO R1) 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 c.ret?
*/})
</script>
※n9/n12:飛び先とのハーフワード(2byte)数の差分<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 op
PUSH Rs,u8 1 1 0 u5-2 u7-6 Rs 1 0 c.swsp
POP Rd,u8 0 1 0 u5 Rd u4-2 u7-6 1 0 c.lwsp
Rd' = SP + u10 0 0 0 u5-4 u9-6 u2 u3 Rd' 0 0 c.addi4spn
SP += n10 0 1 1 n9 0 0 0 1 0 n4 n6 n8-7 n5 0 1 c.addi16sp
*/})
</script>
※PUSH: [SP + 4*u8]L = Rs, POP: Rd = [SP + 4*u8]L (スタックポインタは変化しない)<br>
※u8/u10:4byte単位のオフセット<br>
※SP+=n10: n10は16byte単位<br>
※SP = R2<br>
<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 op
NOP (=1) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 c.nop
BKPT 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 c.ebreak
WFI 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 wfi
0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 -
*/})
</script>
※NOP:なにもしない(no operation) R0+=0<br>
<table id="t9900a" class=tarmasm></table>
<script>
makeTable("t9900a", function() {/*
32bit代入 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 op
Rd = n32 n15-12 Rd 0 1 1 0 1 1 1 lui
n31-16 -
*/})
</script>
※n32の下位12ビットは0固定<br>
<table id="t9901a" class=tarmasm></table>
<script>
makeTable("t9901a", function() {/*
32bit演算 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 op
Rd = PC + n32 n15-12 Rd 0 0 1 0 1 1 1 auipc
n31-16 -
Rd = Rm + n12 Rm0 0 0 0 Rd 0 0 1 0 0 1 1 addi
n12 Rm4-1 -
Rd = Rm + Rs Rm0 0 0 0 Rd 0 1 1 0 0 1 1 add
0 0 0 0 0 0 0 Rs Rm4-1 -
Rd = Rm - Rs Rm0 0 0 0 Rd 0 1 1 0 0 1 1 sub
0 1 0 0 0 0 0 Rs Rm4-1 -
Rd = Rm << u5 Rm0 0 0 1 Rd 0 0 1 0 0 1 1 slli
0 0 0 0 0 0 0 u5 Rm4-1 -
Rd = Rm >> u5 Rm0 1 0 1 Rd 0 0 1 0 0 1 1 srli
0 0 0 0 0 0 0 u5 Rm4-1 -
Rd = Rm >>> u5 Rm0 1 0 1 Rd 0 0 1 0 0 1 1 srai
0 1 0 0 0 0 0 u5 Rm4-1 -
Rd = Rm << Rs Rm0 0 0 1 Rd 0 1 1 0 0 1 1 sll
0 0 0 0 0 0 0 Rs Rm4-1 -
Rd = Rm >> Rs Rm0 1 0 1 Rd 0 1 1 0 0 1 1 srl
0 0 0 0 0 0 0 Rs Rm4-1 -
Rd = Rm >>> Rs Rm0 1 0 1 Rd 0 1 1 0 0 1 1 sra
0 1 0 0 0 0 0 Rs Rm4-1 -
Rd = Rm ^ n12 Rm0 1 0 0 Rd 0 0 1 0 0 1 1 xori
n12 Rm4-1 -
Rd = Rm | n12 Rm0 1 1 0 Rd 0 0 1 0 0 1 1 ori
n12 Rm4-1 -
Rd = Rm & n12 Rm0 1 1 1 Rd 0 0 1 0 0 1 1 andi
n12 Rm4-1 -
Rd = Rm ^ Rs Rm0 1 0 0 Rd 0 1 1 0 0 1 1 xor
0 0 0 0 0 0 0 Rs Rm4-1 -
Rd = Rm | Rs Rm0 1 1 0 Rd 0 1 1 0 0 1 1 or
0 0 0 0 0 0 0 Rs Rm4-1 -
Rd = Rm & Rs Rm0 1 1 1 Rd 0 1 1 0 0 1 1 and
0 0 0 0 0 0 0 Rs Rm4-1 -
*/})
</script>
※n32:4096byte単位<br>
※ >> : 符号なし右シフト、>>> : 符号付き右シフト<br>
<table id="t9902a" class=tarmasm></table>
<script>
makeTable("t9902a", function() {/*
32bitメモリアクセス 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 op
Rd = [Rm + n12] Rm0 1 0 0 Rd 0 0 0 0 0 1 1 lbu
n12 Rm4-1 -
Rd = [Rm + n12]C Rm0 0 0 0 Rd 0 0 0 0 0 1 1 lb
n12 Rm4-1 -
Rd = [Rm + n12]W Rm0 1 0 1 Rd 0 0 0 0 0 1 1 lhu
n12 Rm4-1 -
Rd = [Rm + n12]S Rm0 0 0 1 Rd 0 0 0 0 0 1 1 lh
n12 Rm4-1 -
Rd = [Rm + n12]L Rm0 0 1 0 Rd 0 0 0 0 0 1 1 lw
n12 Rm4-1 -
[Rm + n12] = Rs Rm0 0 0 0 n4-0 0 1 0 0 0 1 1 sb
n11-5 Rs Rm4-1 -
[Rm + n12]W = Rs Rm0 0 0 1 n4-0 0 1 0 0 0 1 1 sh
n11-5 Rs Rm4-1 -
[Rm + n12]L = Rs Rm0 0 1 0 n4-0 0 1 0 0 0 1 1 sw
n11-5 Rs Rm4-1 -
*/})
</script>
※[]後の記号でメモリサイズと符号を表す(W:2byte、L:4byte、C:符号付き1byte、S:符号付き2byte)<br>
※オフセットはサイズにかかわらず1byte単位<br>
<table id="t9903a" class=tarmasm></table>
<script>
makeTable("t9903a", function() {/*
32bit比較 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 op
Rd = Rm < n12 Rm0 0 1 0 Rd 0 0 1 0 0 1 1 slti
n12 Rm4-1 -
Rd = LTU(Rm, n12) Rm0 0 1 1 Rd 0 0 1 0 0 1 1 sltiu
n12 Rm4-1 -
Rd = Rm < Rs Rm0 0 1 0 Rd 0 1 1 0 0 1 1 slt
0 0 0 0 0 0 0 Rs Rm4-1 -
Rd = LTU(Rm, Rs) Rm0 0 1 1 Rd 0 1 1 0 0 1 1 sltu
0 0 0 0 0 0 0 Rs Rm4-1 -
*/})
</script>
※Rmの方が小さければ1、そうでなければ0となる<br>
※LTU:符号なし比較<br>
<table id="t9904a" class=tarmasm></table>
<script>
makeTable("t9904a", function() {/*
32bit分岐 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 op
JAL Rd, n21 n15-12 Rd 1 1 0 1 1 1 1 jal
n20 n10-1 n11 n19-16 -
JALR Rd, Rs + n12 Rs0 0 0 0 Rd 1 1 0 0 1 1 1 jalr
n12 Rs4-1 -
IF Rm = Rs GOTO n13 Rm0 0 0 0 n4-1 n11 1 1 0 0 0 1 1 beq
n12 n10-5 Rs Rm4-1 -
IF Rm != Rs GOTO n13 Rm0 0 0 1 n4-1 n11 1 1 0 0 0 1 1 bne
n12 n10-5 Rs Rm4-1 -
IF Rm < Rs GOTO n13 Rm0 1 0 0 n4-1 n11 1 1 0 0 0 1 1 blt
n12 n10-5 Rs Rm4-1 -
IF Rm >= Rs GOTO n13 Rm0 1 0 1 n4-1 n11 1 1 0 0 0 1 1 bge
n12 n10-5 Rs Rm4-1 -
IF LTU(Rm, Rs) GOTO n13 Rm0 1 1 0 n4-1 n11 1 1 0 0 0 1 1 bltu
n12 n10-5 Rs Rm4-1 -
IF GEU(Rm, Rs) GOTO n13 Rm0 1 1 1 n4-1 n11 1 1 0 0 0 1 1 bgeu
n12 n10-5 Rs Rm4-1 -
*/})
</script>
※n21,n13(IF系):飛び先とのハーフワード(2byte)数の差分<br>
※n12(JALR):1byte単位<br>
<table id="t9905a" class=tarmasm></table>
<script>
makeTable("t9905a", function() {/*
32bit CSR操作 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 op
CSRRW Rd, u12, Rs Rs0 0 0 1 Rd 1 1 1 0 0 1 1 csrrw
u12 Rs4-1 -
CSRRS Rd, u12, Rs Rs0 0 1 0 Rd 1 1 1 0 0 1 1 csrrs
u12 Rs4-1 -
CSRRC Rd, u12, Rs Rs0 0 1 1 Rd 1 1 1 0 0 1 1 csrrc
u12 Rs4-1 -
CSRRWI Rd, u12, u5 u0 1 0 1 Rd 1 1 1 0 0 1 1 csrrwi
u12 u4-1 -
CSRRSI Rd, u12, u5 u0 1 1 0 Rd 1 1 1 0 0 1 1 csrrsi
u12 u4-1 -
CSRRCI Rd, u12, u5 u0 1 1 1 Rd 1 1 1 0 0 1 1 csrrci
u12 u4-1 -
CPSID 0 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 csrrci
0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 -
CPSIE 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 1 csrrsi
0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 -
*/})
</script>
※CPSID:割り込み禁止 CSRRCI R0, #300, 8<br>
※CPSIE:割り込み許可 CSRRSI R0, #300, 8
<table id="t9906a" class=tarmasm></table>
<script>
makeTable("t9906a", function() {/*
32bitその他 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 op
FENCE 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 fence
0 0 0 0 PI PO PR PW SI SO SR SW 0 0 0 0 -
FENCE.TSO 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 fence.tso
1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 -
ECALL 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 ecall
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -
EBREAK 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 ebreak
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 -
MRET 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 mret
0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 -
*/})
</script>
<script>
(function(){
var trs = document.getElementsByTagName("tr");
for (var i = 0; i < trs.length; i++) {
var fc = trs[i].firstChild;
if (fc != null && fc.firstChild == null) trs[i].setAttribute("class", "upper");
}
})();
</script>
</p><p>
<a href=https://fukuno.jig.jp/2720>比べてみよう、RISC-VとArm、RISC-V対応かんたんマシン語「asm15r」</a><br>
<a href=armasm.html>Cortex-M0 Armマシン語表(asm15)</a><br>
</p><p>
<!--
- 連載、RISC-Vマシン語入門<br>
<a href=http://fukuno.jig.jp/1184>1. はじめてのマシン語</a><br>
<a href=http://fukuno.jig.jp/1186>2. ハンドアセンブルで超速計算!</a><br>
<a href=http://fukuno.jig.jp/1188>3. マシン語メモリアクセスで画面超速表示!</a><br>
<a href=http://fukuno.jig.jp/1476>4. マシン語でLEDを光らせよう!</a><br>
<a href=http://fukuno.jig.jp/1479>5. 楽しさ広がるマルチバイトメモリアクセスとスタック</a><br>
<a href=http://fukuno.jig.jp/1484>6. マシン語使いこなしTIPS</a><br>
<a href=http://fukuno.jig.jp/1485>7. カジュアルに使うインラインマシン語</a><br>
<a href=http://fukuno.jig.jp/1757>8. アセンブラを使って楽しよう</a><br>
<a href=http://fukuno.jig.jp/1849>9. マシン語で高速SPI</a><br>
<a href=http://fukuno.jig.jp/1872>10. マシン語を制するもの時間を制す</a><br>
<a href=http://fukuno.jig.jp/1889>11. 画面をイチゴで埋め尽くす12の方法</a><br>
<a href=http://fukuno.jig.jp/2035>12. レジスタ不足に上位レジスタとスタック操作</a><br>
-->
<!--
クロックを意識して特殊演算
4byte rotate
条件分岐キャリー
まとめてload/store
関数(除算)
-->
</p><p>
DATA: <a href=https://riscv.org/specifications/>Specifications - RISC-V Foundation</a><br>
<a href="https://ichigojam.github.io/asm15/rvasm.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
</body></html>