はじめに
本記事はVB.NETの初歩的な記法だけを使って、簡単な機械語で動く仮想CPUの実装法を解説します(※CPUにもいろいろありますが、この記事ではIntel社が製造しているCPUを対象とします)。その過程を通じて、初心者でもバイナリプログラミングが楽しめることと、バイナリプログラミングの魅力を伝えたいと思っています。
前回は、仮想CPUの動きが目に見えるように実装しました。今回はそのテストドライバをさらに改良して機械語の実装を行いやすい環境を整えます。
これまでの連載
下準備
今回は前回の実装を拡張していきますので、あらかじめ前回までの部分の実装を済ませておいてください。後は専門用語とCPU構造の確認のため、第1回で用意した3つのIntel社のマニュアルをすぐ読める状態にしてください。
それに加えて、中巻 B: 命令セット・リファレンス N-ZのA-6とA-7ページを印刷しておくことをお勧めします。絶対に必要なことではありませんが、この表をあらかじめ印刷しておき、その紙を参照しながら実装作業をすると効率がよくなります。
テストドライバの利便化
前回仮想CPUを可視化することができました。今回はそのテストドライバをより便利なように改良していきます。
まず改良するべきところはMoveDataButton_Click
メソッドです。次の抜粋を見てください。
Select Case RegisterCombo.SelectedItem Case "EAX" cpu.EAX = value ShowEaxRegisters() Case "EBX" cpu.EBX = value ShowEbxRegisters() Case "ECX" cpu.ECX = value ShowEcxRegisters() Case "EDX" cpu.EDX = value ShowEdxRegisters() End Select
現状ではこのように内容を更新したレジスタに合わせて、いちいちShowEaxRegisters
などのメソッドを呼んでいます。前回はレジスタの内部を見るだけだったのでよかったのですが、以降、複数の機械語を実装していくのに問題が生じてきます。
それは、「呼び出しを忘れたり間違ったりする」ことが十分にありえるからです。テストを効率化するためのテストドライバの間違いで時間を費やすのは無駄以外の何物でもありません。
まずは、レジスタの値が変更されたら自動的にIntelCpu
クラスがそれを通知するように改良します。このような形態をイベント駆動型プログラミングと呼びます。この名前を聞いたことがない人がいるかと思いますが、実はすでに行っているはずです。
イベント駆動型とは、「ボタンがクリックされたら処理をする」といった、VBを使用している人ならば日常的に行っているスタイルのことです。ですから身構えず、気楽にこれ以降を読み進めてください。