[PREV] [NEXT] [INDEX]

【9】仮想CPU命令の内部表現

この章はもっと良いアセンブラやコンパイラをつくってあげようという人以外は 無視して頂いてかまいません. 何らかの CPU のアーキテクチャに関する知識が必要です.

《命令の構成》

J3W の仮想CPUは32ビットを単位とする可変長命令で構成されます. パラメータの個数は命令により異なります.

            +----------------+-----------------+
            | 命令 (16bit)   | 時間など(16bit) |
            +----------------+-----------------+
            |   パラメータ (32bit)             |  コード領域の定数データ
            +----------------------------------+
     命令のビット構成
          4bit : 命令グループ
          4bit : 命令メンバ
          8bit : レジスタ指定
                 4bit : レジスタ2
                 4bit : レジスタ1

4bit 4bit 4bit 4bit
命令グループ 命令メンバ レジスタ2 レジスタ1

レジスタ指定 4bit
0   レジスタ未使用
1 RQ プロセスID
2 RL ル-プカウンタ
3 RX レジスタ X
4 RY レジスタ Y
5 RZ レジスタ Z
6 RH レジスタ H
7 RP レジスタ P
8 RB レジスタ B
9 R1 汎用レジスタ R1
A R2 汎用レジスタ R2
B R3 汎用レジスタ R3
C R4 汎用レジスタ R4
D R5 汎用レジスタ R5
E R6 汎用レジスタ R6
F   レジスタ未使用, データメモリ指定

アドレシングモード

レジスタ指定の値によって以下の組み合わせがあります. 各命令によって有効な組み合わせに制限があります.

演算命令では(ADDのとき)
レジスタ レジスタ + 即値
レジスタ レジスタ + レジスタ
レジスタ レジスタ + データメモリ

データ転送命令では
レジスタ 即値
レジスタ ←→ レジスタ
レジスタ ←→ データメモリ

《スタックのしくみ》

ごく普通のスタックです.スタックポインタはプッシュした値のアドレスを示しています. つまり,ポップした場合にレジスタに転送するされる値を示します.

      PUSH            データメモリ高位アドレス側
          +-------------+                   +-------------+
          |previous push| ←sp              |             |
          +-------------+       PUSH RX     +-------------+
          |             |                   | RX          | ←sp
          +-------------+                   +-------------+
          |             |                   |             |
                      データメモリ低位アドレス側

      POP             データメモリ高位アドレス側
          +-------------+                   +-------------+
          |             |                   |             | ←sp
          +-------------+                   +-------------+
          | new         | ←sp  POP R1      |             |
          +-------------+                   +-------------+
          |             |       R1 = new    |             |
                      データメモリ低位アドレス側

《スタックフレームのしくみ》

スタックフレームとは,コンパイラ言語で局所変数を保持する領域をスタック上に 置くために利用する機構です.

以下の図では2つの局所変数を確保するために ENTER 命令を使用し,領域を 解放するために LEAVE を使用しています.J3C 以外のコンパイラをJ3W用に開発 する場合以外は必要ないと思います.

      ENTER           データメモリ高位アドレス側
          CALL後                            ENTER後
          +-------------+                   +-------------+
         9| push arg1   |                  9| push arg1   |
          +-------------+                   +-------------+
         8| push arg2   |                  8| push arg2   |
          +-------------+                   +-------------+
         7| return addr |  ←sp            7| return addr |
          +-------------+                   +-------------+
         6|             |    ENTER 2 →    6| save BP     | ←bp
          +-------------+                   +-------------+
         5|             |    ← LEAVE      5| local 1     |
          +-------------+                   +-------------+
         4|             |                  4| local 2     | ←sp
          +-------------+                   +-------------+
         3|             |                  3|             |
          +-------------+                   +-------------+
                      データメモリ低位アドレス側


[PREV] [NEXT] [INDEX]
ご意見・ご感想は,水谷 純 <mizutani.jun@nifty.ne.jp>まで.