ilasmを実行するインタープリター

作品プログラム
動作環境
プロデル 2.0.1322 Windows 11 Pro 64ビット
投稿者
ohisama
投稿日
2025-07-30 11:22:01
ダウンロード数
87

作品のプログラム

※コンソール

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
    そして
  終わり
終わり
	

▲ページの先頭へ