プロデル、調査 その20

# 概要
プロデルが、CLRらしいので、調べて見た。
練習問題やってみた。

# 練習問題
ilasmを実行するインタープリターを書け。

# サンプルコード

```
※コンソール

ilasmというアセンブルを作る。
ilasmをRUNする。

アセンブルとは
	+コード
	+コード数
	+スタック1
	+スタック2
	+n
	+i
	+文字列スタック
	はじめの手順
	　	コードは｛｝
	　	1を　コード数に　入れる
		「  ldc.i4  100 」を　アセンブラし
　		「  stloc  n    」を　アセンブラし
　		「  ldc.i4  1   」を　アセンブラし
　		「  stloc  i    」を　アセンブラし
　		「loop:          」を　アセンブラし
　		「  ldloc  i    」を　アセンブラし
　		「  ldloc  n    」を　アセンブラし
　		「  bgt  bye    」を　アセンブラし
　		「  ldloc  i    」を　アセンブラし
　		「  ldc.i4  15  」を　アセンブラし
　		「  rem  」を　アセンブラし
　		「  brfalse  fb  」を　アセンブラし
　		「  ldloc  i    」を　アセンブラし
　		「  ldc.i4  5   」を　アセンブラし
　		「  rem  」を　アセンブラし
　		「  brfalse  b  」を　アセンブラし
　		「  ldloc  i    」を　アセンブラし
　		「  ldc.i4  3   」を　アセンブラし
　		「  rem  」を　アセンブラし
		「  brfalse  f  」を　アセンブラし
　		「  ldloc  i    」を　アセンブラし
　		「  call  void  [mscorlib]System.Console::WriteLine(int32)」を　アセンブラし
		「  br  tugi    」を　アセンブラし
		「fb:            」を　アセンブラし
		「  ldstr  "fizzbuzz"」を　アセンブラし
　		「  br  print   」を　アセンブラし
　		「b:             」を　アセンブラし
　		「  ldstr  "buzz"」を　アセンブラし
　		「  br  print   」を　アセンブラし
　		「f:             」を　アセンブラし
　		「  ldstr  "fizz"」を　アセンブラし
　		「print:         」を　アセンブラし
　		「  call  void  [mscorlib]System.Console::WriteLine(string)」を　アセンブラし
　		「tugi:          」を　アセンブラし
　		「  ldloc  i    」を　アセンブラし
　		「  ldc.i4  1   」を　アセンブラし
　		「  add        」を　アセンブラし
　		「  stloc  i    」を　アセンブラし
　		「  br  loop    」を　アセンブラし
　		「bye:           」を　アセンブラし
　		「  ret        」を　アセンブラし
　		コードを報告する
　		コード数を報告する　		　
　	終わり
	[行]をアセンブラする手順
	　	コード（コード数）は　行
	　	コード数は　コード数　+　1
	終わり
	[ラベル1]で行検索する手順
	　	ラベル１は　ラベル1　＆　「:」　　
	　	数2は　5
	　	pcは　1
	　	「行検索」を報告する
	　	ラベル１を報告する
	　	繰り返す
	　　		pc＞コード数なら　繰り返しを抜け出す
	　　		文字列１は　コード（pc）
	　　		文字列１を「  」で区切って、 単語とする
		　　	単語（1）が　ラベル１なら
		　　　		数2は　pc
				繰り返しを抜け出す
	　　		そして
	　　		pcは　pc　＋　1
	　	そして
	　	数2を報告する
	　	数2を　返す
	終わり
	自分をRUNする手順
	　	スタック1は　0
	　	スタック2は　0
	　	nは　0
	　	iは　0
	　	pcは　１
	　	繰り返す
	　　		pc＞43なら
	　			「終了」を表示する
	　　　			繰り返しを抜け出す
	　　		そして
	　　		文字列１は、コード（pc）　
			文字列１を「  」で区切って、 単語とする
			//単語（2）を表示する
	　　		単語（2）が「ret」なら
	　　			「ret」を報告する
		　		繰り返しを抜け出す
	　　		他で単語（2）が「rem」なら
		　　　		スタック1は　スタック2　％　スタック1
		　　　	他で単語（2）が「add」なら
	　　　			スタック1は　スタック2　+　スタック1
	　　		他で単語（2）が「call」なら
	　　　			単語（4）が　「[mscorlib]System.Console::WriteLine(int32)」なら
	　　　				スタック1を　表示する
	　　　			他なら
	　　　				文字列スタックを　表示する
	　　　			そして
	　　		他で単語（2）が「ldloc」なら
		　　　		単語（3）が「n」なら
			　　　　	スタック2は　スタック1
			　　　　	スタック1は　n　
			　　　　そして
		　　　		単語（3）が　「i」なら
	　　　　			スタック2は　スタック1
	　　　　			スタック1は　i
	　　　			そして
	　　		他で単語（2）が「stloc」なら
		　　　		単語（3）が　「n」なら
		　　　　		nは　スタック1
		　　　　		スタック1は　スタック2
		　　　		そして
		　　　		単語（3）が　「i」なら
		　　　　		iは　スタック1
		　　　　		スタック1は　スタック2
		　　　		そして
		　　	他で単語（2）が「bgt」なら
			　　	//「bgt」を報告する
	　　			//スタック1を報告する
　　				//スタック2を報告する
		　　　　	//スタック1＜スタック2　を報告する
		　　　　	スタック1＜スタック2　なら	
		　　　　		「jmp」を報告する
			　　　　	スタック1は　1
		　　　　		pcは、単語（3）で　行検索
			　　　　そして
		　　	他で単語（2）が「brfalse」なら
		　　　		スタック1＜1 なら
　		　　		　	pcは、単語（3）で　行検索
　　　				そして
　　			他で単語（2）が「br」なら
			　　　pcは、単語（3）で　行検索
　　			他で単語（2）が「ldc.i4」なら
　　				数１は、1
			　　　	数１は、単語（3）
			　　　	スタック2は　スタック1
　　　		　		スタック1は　数1 + 0
　　　		　	他で単語（2）が「ldstr」なら
　　　				文字列スタックは　単語（3）
　　　			そうでなければ
　　　				//単語（2）を表示する
　　			そして
　　			pcを報告する
	　　		文字列１を報告する
　　			//nを報告する
　　			//iを報告する
　　			pcは　pc　＋　1
		そして
	終わり
終わり




```

# 実行結果

```
1
2
"fizz"
4
"buzz"
"fizz"
7
8
"fizz"
"buzz"
11
"fizz"
13
14
"fizzbuzz"
16
17
"fizz"
19
"buzz"
"fizz"
22
23
"fizz"
"buzz"
26
"fizz"
28
29
"fizzbuzz"
31
32
"fizz"
34
"buzz"
"fizz"
37
38
"fizz"
"buzz"
41
"fizz"
43
44
"fizzbuzz"
46
47
"fizz"
49
"buzz"
"fizz"
52
53
"fizz"
"buzz"
56
"fizz"
58
59
"fizzbuzz"
61
62
"fizz"
64
"buzz"
"fizz"
67
68
"fizz"
"buzz"
71
"fizz"
73
74
"fizzbuzz"
76
77
"fizz"
79
"buzz"
"fizz"
82
83
"fizz"
"buzz"
86
"fizz"
88
89
"fizzbuzz"
91
92
"fizz"
94
"buzz"
"fizz"
97
98
"fizz"
"buzz"


```


以上。