ヴァーチャルマシン仕様

目次

  1. 1 概要
  2. 2 実行ファイル
  3. 3 マシンの仕様
    1. 3.1 命令
      1. 3.1.1 命令表
      2. 3.1.2 CPAについて
      3. 3.1.3 OutSについて
  4. 4 参考資料

1 概要

ヴァーチャルマシンpascの仕様を、以下に示します。


2 実行ファイル

アセンブラのニーモニックが書かれた物ではなく、
アセンブル後のバイトコードが書かれたファイルを実行します。

ヴァーチャルマシンは、ファイルの先頭から実行を開始します。


3 マシンの仕様

  1. 1語は16bitです。
     最上位ビットを15番、最下位ビットを0番とします。
  2. 主記憶はプログラム用65536語
    ユーザー用65536語を持ちます。

    プログラム用メモリ空間には、実行すべきプログラムが格納されます。
    ユーザー用メモリ空間は、スタックなどユーザープログラムが自由に使用することが出来ます。
  3. 数値は16bitの2進数で表現します。負数は、2の補数で表現します。
  4. 制御方式は逐次制御で、命令語は1語長または2語長です。
  5. レジスタとして、GR(16bit)、SP(16bit)、PC(16bit)、FR(2bit)の4種類があります。
    GR(汎用レジスタ、General Register)は、GR0〜GR4,bpの6個があり、算術、論理、比較、シフトなどの演算に用います。
    このうち、GR1〜GR4,bpのレジスタは、指標レジスタ(IndexRegister)としてアドレスの修飾にも用います。
    sp(スタックポインタ、Stack Pointer)は、スタックの最上段のアドレスを保持しています。
    FR(フラグレジスタ、Flag Register)は、SF(Sign Flag)、ZF(Zero Flag)と呼ぶ2個のビットからなり、
    演算命令などの実行によって次の値が設定されます。
    これらの値は、条件付き分岐命令で参照されます。

    SF 演算結果の符合が負(ビット番号15が1)のとき1、それ以外のとき0になります。
    ZF 演算結果が零(全部のビットが0)のとき1、それ以外のとき0になります。

3.1 命令

基本的には、COMETと同じ物をサポートします。
しかし、COMETの命令セットでは十分ではないので、
直値をレジスタにロードするMoveの様な、いくつかの命令を追加します。

COMETでは、INやOUTをマクロ命令として実装し、
スーパーバイザコールなどに展開されますが、
pascでは、IN,OUTなどもマシンが直接実装します。


3.1.1 命令表

r,r1,r2はGR0〜GR4,bp,sp
xはGR0〜GR4,bp,sp
addrはアドレス
valueは値
をそれぞれ取ります。

OPの値は16進数です。

15-8 7-4 3-0 15-0 ←ビット番号    
第一語 第2語 命令語長 機械語命令 解説
OP r/r1 r2/x addr/value
00 - - - 1 NOP No operation
10       2 Load r,addr,x r <- (addr+x)
11       2 Store r,addr,x (r) -> addr+x
12       2 LAD r,addr,x r <- addr+x
13       2 Move r,value r <- value
14     - 1 Load r1,r2 r1 <- (r2)
20       2 AddA r,addr,x r <- (r) + (addr+x)
21     - 1 AddA r1,r2 r <- (r1) + (r2)
22       2 SubA r,addr,x r <- (r) - (addr+x)
23     - 1 SubA r1,r2 r <- (r1) - (r2)
24       2 MulA r,addr,x r <- (r) * (addr+x)
25     - 1 MulA r1,r2 r <- (r1) * (r2)
26       2 DivA r,addr,x r <- (r) / (addr+x)
27     - 1 DivA r1,r2 r <- (r1) / (r2)
28       2 ModA r,addr,x r <- (r) % (addr+x)
29     - 1 ModA r1,r2 r <- (r1) % (r2)
30       2 And r,addr,x r <- (r) & (addr+x)
31     - 1 And r1,r2 r <- (r1) & (r2)
32       2 Or r,addr,x r <- (r) | (addr+x)
33     - 1 Or r1,r2 r <- (r1) | (r2)
34       2 Xor r,addr,x r <- (r) ^ (addr+x)
35     - 1 Xor r1,r2 r <- (r1) ^ (r2)
40       2 CPA r1,adr,x (r) == (addr+x)
44     - 1 CPA r1,r2 (r1)== (r2)
61 -     2 JMI addr,x Jump on minus
62 -     2 JNZ addr,x Jump on non zero
63 -     2 JZE addr,x Jump on zero
64 -     2 JUMP addr,x Unconditional jump
65 -     2 JPL addr,x Jump on plus
70 -     2 Push addr,x (addr+x)をプッシュ
71   - - 1 Pop r rにポップ
72   - - 1 Push r (r)をプッシュ
80 -     2 Call addr,x (addr+x)のroutineをcallする。
81 - - - 1 Ret routineから戻る
F0 -     2 OutIA addr,x (addr+x)を整数で出力
F1   - - 1 OutI r (r)を整数で出力
F2 -     2 OutBA addr,x (addr+x)をboolで出力
F3   - - 1 OutB r (r)をboolで出力
F4 -     不定 OutS value,.. (value.)を文字列で出力
F5 -     2 InA addr,x addr+xに整数を入力
F6   - - 1 In r rに整数を入力

3.1.2 CPAについて

(r1)と(r2)、又は(r)と(実効アドレス)の 算術比較又は論理比較を行い、
比較結果によって、FRに次の値を設定します。

比較結果 FRの値
  SF ZF
(r1)>(r2)
(r)>(実効アドレス)
(r1)=(r2)
(r)=(実効アドレス)
(r1)<(r2)
(r)<(実効アドレス)

3.1.3 OutSについて

OutS命令のオペランドは、出力すべき文字列を先頭から順に指定します。
1文字は1WORD(2バイト)です。
エスケープ文字はバーチャルマシン側で処理します。
0x0000を読み込むと、文字列の終端と判断し、出力を終えます。


4 参考資料