23 ポイント 投稿者 GN⁺ 2025-10-28 | 2件のコメント | WhatsAppで共有
  • 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カーネルのエントリ/復帰コードを提供

参考資料とライセンス

  • チュートリアルおよびコードはいずれも CC0パブリックドメイン または 0-clause BSDライセンス
  • 原文およびコードリポジトリ: https://github.com/dramforever/easyriscv
  • RISC-V学習向けとして、教育・研究・シミュレーション環境の構築に適している

2件のコメント

 
lsdcnu 2025-11-06

わあ
大学の専門授業で学ぶRISC-Vアセンブリに興味が湧いて、別に本を買って読もうとしてもARMアーキテクチャのものばかりでRISC-Vは見当たらず、何を見ればいいのか悩んでいたところだったのですが、学習するのにとても良いリソースを見つけた気がします。
ありがとうございます!!!

 
GN⁺ 2025-10-28
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 は少し保守的すぎる設計なのではないかと思うこともある。

    • おそらく RISC-V は RISC-1 により近いのだと思う。Patterson 自身が説明している記事がある: How close is RISC-V to RISC-I, RISC on a Chip
    • 私も RISC-V と MIPS の類似性を感じた。Nintendo 64 のホームブリュー開発をしているときに、「これ、前に Ares+Godbolt で触っていたものとほとんど同じだな、delay slot がないだけだ」とよく思った。
    • AArch64 の設計がどこから来ていて、どんな思想で作られたのかについて、不明瞭な点 が多いことを人々はあまり認識していない。
    • 命令は追加するのは簡単でも、削除するのは難しい。RISC-V は最初に 最小限の命令セット から始まり、その後段階的に拡張されている。新しい命令を提案するには、その コストと実質的な利点 を証明しなければならない。
    • Computer Architecture: A Quantitative Approach にも、RISC-V と MIPS の類似性について書かれていた記憶がある。今は本が箱の中なので、正確なページは分からない。
  • TCP Socket in RISC-V Assembly を自分で書いた。
    RV64I ISA を使っていて、linker relaxation の概念を理解する必要がある。参考資料も一緒に添えてある。

  • Position Independence のセクションに誤りがあるように思う。
    例のコードでは auipc ではなく lui を使えば 0x3004 になるのではないか?

    • そうではない。lui は絶対アドレスを生成するが、auipc/addi の組み合わせは 位置独立なアドレス を作る。auipc が 0 番地にあれば結果は同じだが、実際には現在の命令アドレスに加算された値になる。
  • このコンテンツの インタラクティブな構成 は本当に素晴らしい。
    C/C++ 開発者として、アセンブリはいつも難しいものだと思っていたが、このやり方のおかげではるかに明確に理解できた。

    • RISC-V アセンブリは概して簡単だが、命令の略称 が多すぎて不便だ。lw の代わりに load4j の代わりに jump のような、もっと直感的な名前にしてもよかったはずだ。パンチカード時代でもないのに、なぜこんなに短く書くのか分からない。
  • この記事を見て、また 低レベルプログラミング をやってみたくなった。
    大学ではメカトロニクスを専攻し、C とアセンブリでマイコンを扱っていたが、今は Web 開発に移っている。
    RISC-V ハードウェアを学ぶための 信頼できる資料 があるのか気になる。できれば Rust でやってみたい。

    • Rust で直接ハードウェアを扱うものではないが、OS の基礎を学べる良いチュートリアルがある: Operating System in 1000 Lines
      それとは別に Rust ベースの OS チュートリアルもあったが、今はリンクが見つからない。
      実際のハードウェアが欲しいなら neorv32 を勧める。ドキュメントがよく整っている: 公式ドキュメント, GitHub リポジトリ. VHDL で書かれた RISC-V コアだ。
  • RISC-V ハードウェアは簡単に手に入る。
    RISC-V on Raspberry Pi Pico 2 を参照。

    • まもなく VisionFive 2 Lite も発売される予定なので期待している。ドライバや性能面では少し不足があるが、OS 開発用としては悪くなさそうだ。
      Kickstarter ページ を参照。
      また、RISC-V と FPGA を一緒に扱いたいなら PolarFireSoC もある。AMD/Xilinx よりずっと安く、十分実用的だ。開発環境はやや 古めかしいが高速 で、ドキュメントは散らばっているものの、大抵どこかにはある。
      開発キットのリンク
      面白いことに、開発ボードのほうがチップ単体より安い。
    • たぶん ESP-32 から始めるほうが簡単かもしれない。こちらのほうがずっと広く流通しているからだ。
  • ちょうど今週、C の授業で アセンブリ入門 の単元に入ったところだったので、RISC-V で学べば CPU の違いの問題を避けられそうだと思っていた。
    ところが、誰かがすでにそれを完璧に整理した資料を作ってくれていた。本当にありがたい。

  • 「0 から引くと負になる」という例では、0x123 の負数は 0xfffffedd だ。
    エミュレータが 0xfffffccd を表示すると書かれていたが、実際には 0xfffffedd が正しい。自分で計算してみたし、エミュレータは正確だ

  • 良い RISC-V エミュレータを探しているなら RARS を勧める。