MIPS エミュレータを作ってみた 岡山大学電子計算機研究会 : 瀕死 @hinshiba 2026 -05 -16
自己紹介 2 ◼ ID: hinshiba ◼ Name: 柴田 晴 ◼ 岡山大学 電子計算機研究会 部長 ◼ B3 旧Twitter & GitHub @hinshiba https://hinshiba.net/
過去作品 3 TUI 画像整理 numpy だけの 左手デバイス ニューラルネットワーク 電子ペーパー + サーボモーターの制御 ハッカソン Unity でレースゲーム NO IMG Discord bot セキュリティ・キャンプ Cの標準ライブラリのみで独自言語 冬コミ C107 での出店予定 コネクト 2025 NO IMG 笠岡市との共同プロジェクト ?
Outline ◼ 制作物 ◼ 目的 ◼ 実装 ◼ Demo ◼ おわり 4
Outline ◼ 制作物 ◼ 目的 ◼ 実装 ◼ Demo ◼ おわり 5
製作物 6 ◼ PlusPim : MIPS エミュレータ ◼ 主な目的はデバッグ ◼ Debug Adapter Protocol に準拠 ◼ バックステップ実行もサポート ◼ VSCode 拡張機能部分も作成
エミュレーション 7 ◼命令エミュレーション ◼疑似命令の展開 ◼一部のアセンブラ指令の対応 ◼複数ファイルの読み込み ◼cp0 による正確な例外処理
エミュレーション 8 必須レベルの一部のアセンブラ指令への対応 ◼命令エミュレーション ◼疑似命令の展開 ◼一部のアセンブラ指令の対応 ◼複数ファイルの読み込み ◼cp0 による正確な例外処理
エミュレーション 9 ◼命令エミュレーション ◼疑似命令の展開 ◼一部のアセンブラ指令の対応 ◼複数ファイルの読み込み ◼cp0 による正確な例外処理
エミュレーション 10 ◼命令エミュレーション ◼疑似命令の展開 ◼一部のアセンブラ指令の対応 ◼複数ファイルの読み込み ◼cp0 による正確な例外処理
エミュレーション 11 ◼命令エミュレーション ◼疑似命令の展開 ◼一部のアセンブラ指令の対応 ◼複数ファイルの読み込み ◼cp0 による正確な例外処理
デバッグ機能 12 ◼ステップイン ◼ステップオーバー ◼ステップバック ◼イミディエイトウィンドウ ◼コールスタック ◼例外フィルタ
デバッグ機能 13 ◼ステップイン ◼ステップオーバー ◼ステップバック ◼イミディエイトウィンドウ ◼コールスタック ◼例外フィルタ
デバッグ機能 14 ◼ステップイン ◼ステップオーバー ◼ステップバック ◼イミディエイトウィンドウ ◼コールスタック ◼例外フィルタ
デバッグ機能 15 ◼ステップイン ◼ステップオーバー ◼ステップバック ◼イミディエイトウィンドウ ◼コールスタック ◼例外フィルタ
Outline ◼ 制作物 ◼ 目的 ◼ 実装 ◼ Demo ◼ おわり 16
目的 17
目的 18 QtSPIM が使いずらい 個人の感想です
QtSPIM 19 ◼ステップオーバーがない ◼例外のポップアップが消えない ◼ファイルの読み込み順に依存 ◼別のGUI を開く必要がある ◼フォントが見ずらい ◼etc
PlusPim そういうわけで作成しました https://github.com/hinshiba/PlusPim 20
PlusPim マーケットプレイスにあります https://github.com/hinshiba/PlusPim 21
Outline ◼ 制作物 ◼ 目的 ◼ 実装 ◼ Demo ◼ おわり 22
命令の実行 23 命令列 .text MIPS アセンブリ 0: RTypeInst(add ,Reg::Sp, Reg::Sp, -24) 1: MemInst(store, 4, Reg::Ra, 20, Reg::Sp) ………… .data 47: JrInst() メモリイメージ Dict { 0x10000000: 0x61, 0x10000001: 0x62, …… }
命令の実行 クライアント pc (変数) 24 StepIn Request 命令Index に 変換 命令を取得 0: …… 1: …… ……
命令の実行 25 Stopped Event 命令を取得 0: …… 1: …… …… クライアント 実行して 状態を更新 メモリ IInstruction::Execute レジスタ インターフェース越しに実行
命令の実行 例外が発生 ブレークポイント スタックフレームが減少 (StepOver のみ) 26 Stopped Event 続行 pc += 4 pc -> Index 0: …… 1: …… …… IInstruction::Execute クライアント
ステップバック実行 RTypeInst ◼$rd をスタックに保存 ◼インターフェース経由で Undo 命令ごとに逆操作を定義 27
ステップバック実行 RTypeInst Why ループ内 ◼$rd をスタックに保存 ◼インターフェース経由で 28 同じインスタンスが実行される Undo 命令ごとに逆操作を定義
ステップバック実行 RTypeInst Why ループ内 ◼$rd をスタックに保存 ◼インターフェース経由で 29 同じインスタンスが実行される Undo 命令ごとに逆操作を定義 面倒なバグに
例外 30 pc -> Index 0: …… 1: …… …… IInstruction::Execute AdEL : ロードアドレスエラー RI : 無効な命令 Ov : オーバーフロー MemInst::Execute AdES : ストアアドレスエラー Syscall::Execute Sys: システムコール
例外 例外発生 31 Stopped Event フィルタの設定 例外ハンドラへジャンプ 各種レジスタの設定 停止する場合 続行 クライアント Step
例外 例外発生 32 Stopped Event フィルタの設定 例外ハンドラへジャンプ 各種レジスタの設定 続行する場合 続行 StepBack も可能 クライアント Step
Outline ◼ 制作物 ◼ 目的 ◼ 実装 ◼ Demo ◼ おわり 33
Demo 34 10 の階乗を計算して 5倍し, 2116516 を足すプログラム
利用 講義が終わるまでに実装完了しなかった 35 :( 3年の講義でMIPS アセンブリを書くらしい
利用 36 講義が終わるまでに実装完了しなかった :( 3年の講義でMIPS アセンブリを書くらしい 最初の2回しか MIPS 使わなかった :(
利用 37 講義が終わるまでに実装完了しなかった :( 3年の講義でMIPS アセンブリを書くらしい 最初の2回しか MIPS 使わなかった :(
余談 残りの講義では独自ハードウェア記述言語を書く 38
余談 39 残りの講義では独自ハードウェア記述言語を書く 同じ運命になりそう
Outline ◼ 制作物 ◼ 目的 ◼ 実装 ◼ Demo ◼ おわり 40
MIPS エミュレータを作ってみた 岡山大学電子計算機研究会 : 瀕死 @hinshiba 2026 -05 -16 ご清聴ありがとうございました マーケットプレイス https://marketplace.visualstudio.com/items?itemName=hinshiba.pluspim リポジトリ https://github.com/hinshiba/PlusPim