プログラム解説(pasc.exe)

目次

  1. 1 概要
  2. 2 開発環境
  3. 3 VMクラス
    1. 3.1 概要
    2. 3.2 public関数
      1. 3.2.1 execute
      2. 3.2.2 DebugInfo
    3. 3.3 private関数
    4. 3.4 型
    5. 3.5 変数
  4. 4 例外クラス
    1. 4.1 zero_div_error
    2. 4.2 Illegal_Operation
  5. 5 参考文献

1 概要

ヴァーチャルマシンpascのプログラムについて、以下に示します。


2 開発環境


3 VMクラス

ヴァーチャルマシンをエミュレートするクラスです。


3.1 概要

VMは、各命令をエミュレートするメンバ関数のポインタを、配列に持ちます。

executeが実行されると、バイナリファイルをプログラムメモリ内に読み込み、
先頭から実行を開始します。

命令の実行は、以下のように行われます。
まず、PC(プログラムカウンタ)でプログラムメモリを参照し、1WORDを読み出します。
読み出したWORDの上位8bitで、メンバ関数ポインタの配列を参照し、
関数ポインタを介して、目的の関数を呼び出します。
呼び出された関数は、命令を実行し、必要に応じて、PCを進め、FRを設定します。

以上の操作を繰り返すことによって、実行ファイルを実行します。


3.2 public関数

クラス外部に公開され、実行可能な関数です。


3.2.1 execute

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
flag[1] = Sign flag

_operation typedef void (VM::* _operation) (); VMクラス内のメンバ関数ポインタを持つ型

3.5 変数

変数はすべてprivateで、外部からアクセスすることは出来ません

用途 変数名
GR0〜GR4,bp,sp用 Vec<_regist> regist
プログラムカウンタ(PC)用 _regist pc
フラグレジスタ用 flag fr
ユーザメモリ用 Vec<WORD> memory
プログラムメモリ用 Vec<WORD> p_memory

4 例外クラス

ヴァーチャルマシンで発生する例外のために、
標準例外exceptionクラスから派生したクラスです。
現バージョンでは、Visual C++でしかコンパイルを通りません。

文字列を一つ持ち、what()関数で、その文字列を返します。


4.1 zero_div_error

DIV命令やMOD命令で、0で除算を行おうとしたときに、発生する例外です。
標準で、文字列"Zero Divide Error"を持ちます。


4.2 Illegal_Operation

規定されていない命令を実行しようとしたときに、発生する例外です。
標準で、文字列"Illegal Operation"を持ちます。


5 参考文献