0
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?

プロデル、調査 その20

Last updated at Posted at 2025-06-03

概要

プロデルが、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"


以上。

0
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
0
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?