概要
プロデルが、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は ラベル1 & 「:」
数2は 5
pcは 1
「行検索」を報告する
ラベル1を報告する
繰り返す
pc>コード数なら 繰り返しを抜け出す
文字列1は コード(pc)
文字列1を「 」で区切って、 単語とする
単語(1)が ラベル1なら
数2は pc
繰り返しを抜け出す
そして
pcは pc + 1
そして
数2を報告する
数2を 返す
終わり
自分をRUNする手順
スタック1は 0
スタック2は 0
nは 0
iは 0
pcは 1
繰り返す
pc>43なら
「終了」を表示する
繰り返しを抜け出す
そして
文字列1は、コード(pc)
文字列1を「 」で区切って、 単語とする
//単語(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は、1
数1は、単語(3)
スタック2は スタック1
スタック1は 数1 + 0
他で単語(2)が「ldstr」なら
文字列スタックは 単語(3)
そうでなければ
//単語(2)を表示する
そして
pcを報告する
文字列1を報告する
//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"
以上。