1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ilasmでstack machine その41

Last updated at Posted at 2024-11-06

概要

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個減る

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?