ヴァーチャルマシンpascのプログラムについて、以下に示します。
ヴァーチャルマシンをエミュレートするクラスです。
VMは、各命令をエミュレートするメンバ関数のポインタを、配列に持ちます。
executeが実行されると、バイナリファイルをプログラムメモリ内に読み込み、
先頭から実行を開始します。
命令の実行は、以下のように行われます。
まず、PC(プログラムカウンタ)でプログラムメモリを参照し、1WORDを読み出します。
読み出したWORDの上位8bitで、メンバ関数ポインタの配列を参照し、
関数ポインタを介して、目的の関数を呼び出します。
呼び出された関数は、命令を実行し、必要に応じて、PCを進め、FRを設定します。
以上の操作を繰り返すことによって、実行ファイルを実行します。
クラス外部に公開され、実行可能な関数です。
void execute(string filename); と宣言されています。
文字列を一つ受け取り、そのファイル名の実行ファイルを実行します。
3.2.2 DebugInfo
void DebugInfo(); と宣言されています。
デバッグ情報として、各レジスタの値・PCの値を出力します。
3.3 private関数
クラス外部からは、実行不可能な関数です。
ヴァーチャルマシンの各命令と対応した関数があり、
それぞれ、ヴァーチャルマシンの命令をエミュレートします。
3.4 型
VMクラスの中だけで使う、独自の型を解説します。
型名 | 宣言 | 解説 |
---|---|---|
Vec | 略 | 型範囲チェック付きの配列 範囲外へアクセスしようとすると、out_of_range例外を投げる |
BYTE | typedef unsigned char BYTE; | 1byteの型 |
WORD | typedef unsigned short | 2byteの型 |
_register | typedef WORD _register; | 2byteの型 レジスタ表現用 |
flag | typedef bitset<2> flag; | 2bitの型 フラグレジスタ表現用 flag[0] = Zero flag |
_operation | typedef void (VM::* _operation) (); | VMクラス内のメンバ関数ポインタを持つ型 |
変数はすべてprivateで、外部からアクセスすることは出来ません
用途 | 型 | 変数名 |
---|---|---|
GR0〜GR4,bp,sp用 | Vec<_regist> | regist |
プログラムカウンタ(PC)用 | _regist | pc |
フラグレジスタ用 | flag | fr |
ユーザメモリ用 | Vec<WORD> | memory |
プログラムメモリ用 | Vec<WORD> | p_memory |
ヴァーチャルマシンで発生する例外のために、
標準例外exceptionクラスから派生したクラスです。
現バージョンでは、Visual C++でしかコンパイルを通りません。
文字列を一つ持ち、what()関数で、その文字列を返します。
DIV命令やMOD命令で、0で除算を行おうとしたときに、発生する例外です。
標準で、文字列"Zero Divide Error"を持ちます。
規定されていない命令を実行しようとしたときに、発生する例外です。
標準で、文字列"Illegal Operation"を持ちます。