-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrvasm.html
198 lines (183 loc) · 6.42 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
<!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: 9em;
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;
}
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>
<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 <<= u6 0 0 0 u5 Rd u4-0 1 0 c.slli
Rd += Rm 1 0 0 1 Rd Rm 1 0 c.add
Rd' >>= u6 1 0 0 u5 0 0 Rd' u4-0 0 1 c.srli
Rd' >>>= u6 1 0 0 u5 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 -
*/})
</script>
※mul/div/remにC命令なし、mulh,mulhsu,mulhu,divu,remuもある<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 u1-0は0<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 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?
*/})
/*
本来は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>
※n12:飛び先とのバイト数の差分(n11でn12の1/2の値で指定)<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>
※n8:4byte単位のオフセット<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>
<!--
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>
<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>
Text: CC BY <a href=https://ichigojam.net/>ichigojam.net</a><br>
</body></html>