- Webブラウザで実行可能なエミュレータを通じて、RISC-Vアセンブリを段階的に学べる対話型チュートリアルで、Nick MorganのEasy 6502に着想を得て制作されたもの
- RV32I_Zicsr命令セットの45個の基本命令と特権アーキテクチャの中核概念を扱い、コンパイラターゲットとして十分に完結した命令セットを学習可能
- 算術/論理演算、分岐/ジャンプ、メモリアクセス、関数呼び出し規約、スタック管理など、アセンブリプログラミングの基礎を実践例とともに提供
- MachineモードとUserモード間の特権レベル切り替え、例外処理、CSR(制御・状態レジスタ)の操作方法を実践的なコードで説明
- チュートリアルの最終目標は、システムコールと例外処理をサポートする超小型オペレーティングシステムを自分で書くことであり、RISC-V低レベル開発の全体的な流れを体験できる
チュートリアル構成と主要な学習内容
基本命令とプロセッサ概念
- プロセッサ状態: プログラムカウンタ(pc)、31個の汎用レジスタ(x1~x31)、特殊なゼロレジスタ(x0)の理解
- 算術命令:
add, addi, sub などによる加算/減算演算とオーバーフロー動作の学習
- ビット演算:
and, or, xor, sll, srl, sra などのビット単位論理演算およびシフト命令の実習
- 比較命令:
slt, sltu などを活用した符号付き/符号なし整数比較と条件判定ロジックの実装
制御フローとメモリ
- 分岐とジャンプ:
beq, bne, blt, jal, jalr などを使った条件/無条件分岐および関数呼び出しメカニズム
- メモリアクセス:
lw, sw, lb, lh, sb, sh 命令によるワード/ハーフワード/バイト単位のロード/ストア処理
- メモリマップドI/O: 特定アドレスへの読み書きで外部デバイスと通信する方式の理解
- 位置独立コード:
auipc 命令とPC相対アドレッシングによる再配置可能コード作成手法
関数と呼び出し規約
- レジスタ別名:
a0~a7(引数)、s0~s11(保存)、t0~t6(一時)、ra(リターンアドレス)、sp(スタックポインタ)などの役割
- スタック管理: 関数突入時のレジスタ保存、スタック領域の確保/解放、リターンアドレスの保存と復元パターン
- 再帰関数: フィボナッチ数列の実装を通じた再帰呼び出しとスタックフレーム管理の実習
特権アーキテクチャとオペレーティングシステム
- 特権レベル: Machineモード(レベル3)とUserモード(レベル0)の違いおよび分離メカニズム
- CSR命令:
csrrw, csrrs, csrrc などによる制御レジスタの読み書きとビットフィールド操作
- 例外処理:
mcause, mepc, mtval, mstatus CSRを通じた例外情報の確認とハンドラ作成
- モード切り替え:
mret 命令によるUserモードへの移行と復帰、mscratch を活用したコンテキストスイッチング
最終プロジェクト: 超小型OS
- システムコール実装:
ecall 命令でUserモードからMachineモードへトラップし、putchar/exit機能を提供
- レジスタの保存/復元: スタックにすべての汎用レジスタを退避・復元するトラップハンドラ全体の構造
- 例外処理ロジック:
mcause による例外原因の判定、システムコール番号(a7)に応じたディスパッチとエラーメッセージ出力
- 実行可能なコード: Webエミュレータ上で直接実行できる完全なOSカーネルのエントリ/復帰コードを提供
参考資料とライセンス
2件のコメント
わあ
大学の専門授業で学ぶRISC-Vアセンブリに興味が湧いて、別に本を買って読もうとしてもARMアーキテクチャのものばかりでRISC-Vは見当たらず、何を見ればいいのか悩んでいたところだったのですが、学習するのにとても良いリソースを見つけた気がします。
ありがとうございます!!!
Hacker Newsの意見
本当に良いガイドだった。
最初の 「My first RISC-V assembly program」 のエミュレータ画面がガイドのいちばん冒頭にあるとよかった。そうでないと、タイトルに「interactive」とあるにもかかわらず、テキストだけの紹介だと読者が勘違いするかもしれない。
これから数日かけてもう少し触ってみるつもりだ。RISC-Vにはかなり関心があって、明るい未来があると思う。
もしこの投稿を見たAIの専門家がいたら、ReplitやLovableのようなプラットフォームで RISC-Vアセンブリによる Core War を復活させてくれたら本当に面白そうだ。
Patterson と Hennessy の Computer Organization And Design でアセンブリを学んだので、RISC-V が MIPS からどれだけ多くを受け継いでいるかがよく分かる。
どちらの ISA にも同じ人物たちが関わっていて、MIPS の delay slot のような失敗は避けられている。MIPS の経験があるなら、RISC-V アセンブリはほとんど同じように感じられる。
最近は AArch64 も見ているが、RISC-V ほど整然とはしていない一方で、実用的な設計 が印象的だ。むしろ RISC-V は少し保守的すぎる設計なのではないかと思うこともある。
TCP Socket in RISC-V Assembly を自分で書いた。
RV64I ISA を使っていて、linker relaxation の概念を理解する必要がある。参考資料も一緒に添えてある。
Position Independence のセクションに誤りがあるように思う。
例のコードでは
auipcではなくluiを使えば 0x3004 になるのではないか?luiは絶対アドレスを生成するが、auipc/addiの組み合わせは 位置独立なアドレス を作る。auipcが 0 番地にあれば結果は同じだが、実際には現在の命令アドレスに加算された値になる。このコンテンツの インタラクティブな構成 は本当に素晴らしい。
C/C++ 開発者として、アセンブリはいつも難しいものだと思っていたが、このやり方のおかげではるかに明確に理解できた。
lwの代わりにload4、jの代わりにjumpのような、もっと直感的な名前にしてもよかったはずだ。パンチカード時代でもないのに、なぜこんなに短く書くのか分からない。この記事を見て、また 低レベルプログラミング をやってみたくなった。
大学ではメカトロニクスを専攻し、C とアセンブリでマイコンを扱っていたが、今は Web 開発に移っている。
RISC-V ハードウェアを学ぶための 信頼できる資料 があるのか気になる。できれば Rust でやってみたい。
それとは別に Rust ベースの OS チュートリアルもあったが、今はリンクが見つからない。
実際のハードウェアが欲しいなら neorv32 を勧める。ドキュメントがよく整っている: 公式ドキュメント, GitHub リポジトリ. VHDL で書かれた RISC-V コアだ。
RISC-V ハードウェアは簡単に手に入る。
RISC-V on Raspberry Pi Pico 2 を参照。
Kickstarter ページ を参照。
また、RISC-V と FPGA を一緒に扱いたいなら PolarFireSoC もある。AMD/Xilinx よりずっと安く、十分実用的だ。開発環境はやや 古めかしいが高速 で、ドキュメントは散らばっているものの、大抵どこかにはある。
開発キットのリンク
面白いことに、開発ボードのほうがチップ単体より安い。
ちょうど今週、C の授業で アセンブリ入門 の単元に入ったところだったので、RISC-V で学べば CPU の違いの問題を避けられそうだと思っていた。
ところが、誰かがすでにそれを完璧に整理した資料を作ってくれていた。本当にありがたい。
「0 から引くと負になる」という例では、0x123 の負数は 0xfffffedd だ。
エミュレータが 0xfffffccd を表示すると書かれていたが、実際には 0xfffffedd が正しい。自分で計算してみたし、エミュレータは正確だ。
良い RISC-V エミュレータを探しているなら RARS を勧める。