概要
ilasmでstack machineやってみた。
俺cpuはstack machineなので、ilasmのニーモニックが動くように改造してみる。
構想編。
設計
俺CPUの仕様
スタックマシン
-
命令長 12ビット
-
命令メモリー 12ビット256バイト
-
レジスタ 8ビット
文字列用 8バイト
プログラムカウンタ 1バイト
スタック用 6バイト
アウト 1バイト
変数用 2バイト
乱数用 1バイト -
フラグ 1ビット
ジャンプ用 -
命令セット
| 命令コード | ニーモニック | 意味 | stackの状態 |
|---|---|---|---|
| 000 | nop | 何もしない。 | 変化無し |
| 001 | ret | 戻る | 変化無し |
| 1nn | ldc.i4 nn | stackに整数 nnを積む。 | 1個増える |
| 2nn | ldstr "fizzbuzz" | stackに「fizzbuzz」を積む。 | 変化無し |
| 4nn | call void [mscorlib] System.Console::WriteLine(int32) | stackを数値印刷。 | 1個減る |
| 5nn | call void [mscorlib] System.Console::WriteLine(string) | stackを文字印刷。 | 変化無し |
| 6nn | beq nn | セカンドとトップを比べて等しいならnnに飛ぶ。 | 2個減る |
| 7nn | bgt nn | セカンドとトップを比べて小さいならnnに飛ぶ。 | 2個減る |
| 8nn | blt nn | セカンドとトップを比べて大きいならnnに飛ぶ。 | 2個減る |
| 9nn | br nn | nnへ飛ぶ。 | 変化無し |
| ann | brfalse nn | ゼロで無いならnnに飛ぶ。 | 1個減る |
| bnn | brtrue nn | ゼロならnnに飛ぶ。 | 1個減る |
| f00 | dup | stackにコピーを積む。 | 1個増える |
| f01 | pop | stackを一個減らす。 | 1個減る |
| f02 | add | セカンドとトップの加算を求める。 | 1個減る |
| f03 | sub | セカンドとトップの減算を求める。 | 1個減る |
| f04 | mul | セカンドとトップの乗算を求める。 | 1個減る |
| f05 | div | セカンドとトップの除算を求める。 | 1個減る |
| f06 | rem | セカンドとトップの剰余を求める。 | 1個減る |
| f07 | callvirt instance int32 [mscorlib]System.Random::Next(int32) | 乱数を積む | 1個増える |
| f08 | ldloc a | stackに変数aの値を積む。 | 1個増える |
| f09 | stloc a | 変数aにstackを移動。 | 1個減る |
| f0a | ldloc b | stackに変数bの値を積む。 | 1個増える |
| f0b | stloc b | 変数bにstackを移動。 | 1個減る |
以上