この章はもっと良いアセンブラやコンパイラをつくってあげようという人以外は 無視して頂いてかまいません. 何らかの CPU のアーキテクチャに関する知識が必要です.
J3W の仮想CPUは32ビットを単位とする可変長命令で構成されます. パラメータの個数は命令により異なります.
+----------------+-----------------+
| 命令 (16bit) | 時間など(16bit) |
+----------------+-----------------+
| パラメータ (32bit) | コード領域の定数データ
+----------------------------------+
命令のビット構成
4bit : 命令グループ
4bit : 命令メンバ
8bit : レジスタ指定
4bit : レジスタ2
4bit : レジスタ1
| 4bit | 4bit | 4bit | 4bit |
| 命令グループ | 命令メンバ | レジスタ2 | レジスタ1 |
| 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| |
+-------------+ +-------------+
データメモリ低位アドレス側