概要
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個減る |
以上