LoginSignup
1
0

概要

mindが、謎なので調べてみた。
練習問題やってみた。

練習問題

俺cpuのアセンブラでfizzbuzzを実行するインタープリターを書け。

fizzbuzzのソース

0  
set  a
loop:  
get  a
1  
+  
set  a
get  a
100  
>
if  end:
get  a
15  
%  
if  skip0:
"FizzBuzz"
out  
jmp  loop:
skip0:  
get  a
5  
%  
if  skip1:
"Buzz"
out  
jmp  loop:
skip1:  
get  a
3  
%  
if  skip2:
"Fizz"
out  
jmp  loop:
skip2:  
get  a
outi  
jmp  loop:
end:
stop  

サンプルコード



メモ帳は ファイル。
コードは 100個の 文字列実体。
コード数は 変数。
スタック1は 変数。
スタック2は 変数。
スタック3は 文字列。
aは 変数。
bは 変数。

アセンブラとは
 コード(コード数)に 入れ
 コード数に 1を 加えて コード数に 入れる
。

行検索とは
 文字列1は 文字列
 ラベルは 文字列
 単語1は 文字列
 単語2は 文字列
 数2は 変数
 nは 変数
 ラベルに 入れ
 nに 1を 入れ
 数2に 5を 入れ
 ここから
  もし nが コード数より 大きい
  ならば
   打ち切り
  つぎに
  コード(n)を 文字列1に 入れ
  文字列1から 単語切り出し 単語1に 入れ
  文字列1から 単語切り出し 単語2に 入れ
  もし 単語1が ラベルに 等しい文字列
  ならば
   nを 数2に 入れ
   打ち切り
  つぎに
  nに 1を 加えて nに 入れ
 繰り返す
 数2を 返す
。

RUNとは
 文字列1は 文字列
 単語1は 文字列
 単語2は 文字列
 単語3は 文字列
 数1は 変数
 数2は 変数
 合否は 変数
 発見位置は 変数
 nは 変数
 乱数は バイト変数
 乱数に 243を 入れる
 スタック1に 0を 入れ
 スタック2に 0を 入れ
 aに 0を 入れ
 bに 0を 入れ
 nに 1を 入れ
 ここから
  もし nが コード数より 大きい
  ならば
   終り
  つぎに
  コード(n)を 文字列1に 入れ
  文字列1から 単語切り出し 単語1に 入れ
  文字列1から 単語切り出し 単語2に 入れ
  もし 単語1が 「stop」に 等しい文字列
  ならば
   打ち切り
  つぎに

  もし 単語1が 「rnd」に 等しい文字列
  ならば
   乱数に 5を 掛け 乱数に 入れる
   乱数に 1を 引き 乱数に 入れる
   乱数を スタック1に 入れる
  つぎに

  もし 単語1が 「*」に 等しい文字列
  ならば
   スタック2と スタック1を 掛けて スタック1に 入れる
  つぎに

  もし 単語1が 「%」に 等しい文字列
  ならば
   スタック2を スタック1で 剰余を スタック1に 入れる
  つぎに

  もし 単語1が 「+」に 等しい文字列
  ならば
   スタック2と スタック1を 加えて スタック1に 入れる
  つぎに

  もし 単語1が 「=」に 等しい文字列
  ならば
   もし スタック1と スタック2が 等しい
   ならば
    スタック1に 0を 入れる
   さもなければ
    スタック1に 1を 入れる
   つぎに
  つぎに

  もし 単語1が 「>」に 等しい文字列
  ならば
   もし スタック1より スタック2が 大きい
   ならば
    スタック1に 1を 入れる
   さもなければ
    スタック1に 0を 入れる
   つぎに
  つぎに

  もし 単語1が 「drop」に 等しい文字列
  ならば
   スタック1に スタック2を 入れる
  つぎに

  もし 単語1が 「outi」に 等しい文字列
  ならば
   スタック1を 数値表示し 「 」を 表示し
  つぎに

  もし 単語1が 「out」に 等しい文字列
  ならば
   スタック3を 表示し 「 」を 表示し
  つぎに

  もし 単語1が 「ret」に 等しい文字列
  ならば
   改行し
  つぎに

  もし 単語1が 「get」に 等しい文字列
  ならば
   もし 単語2が 「a」に 等しい文字列
   ならば
    スタック2に スタック1を 入れ
    スタック1に aを 入れる
   つぎに
   もし 単語2が 「b」に 等しい文字列
   ならば
    スタック2に スタック1を 入れ
    スタック1に bを 入れる
   つぎに
  つぎに

  もし 単語1が 「set」に 等しい文字列
  ならば
   もし 単語2が 「a」に 等しい文字列
   ならば
    aに スタック1を 入れる
    スタック1に スタック2を 入れ
   つぎに
   もし 単語2が 「b」に 等しい文字列
   ならば
    bに スタック1を 入れる
    スタック1に スタック2を 入れ
   つぎに
  つぎに

  もし 単語1が 「if」に 等しい文字列
  ならば
   もし スタック1が 0より 大きい
   ならば
    単語2で 行検索し nに 入れる
   つぎに
  つぎに

  もし 単語1が 「nf」に 等しい文字列
  ならば
   もし スタック1と 0が 等しい
   ならば
    単語2で 行検索し nに 入れる
   つぎに
  つぎに

  もし 単語1が 「jmp」に 等しい文字列
  ならば
   単語2で 行検索し nに 入れる
  つぎに

  単語3に 単語1を 入れ
  もし '"'で 単語1から 一文字検索し 発見位置に 入れ
  発見位置が 0より 大きい
  ならば
   単語3を スタック3に 入れ
  つぎに

  もし 単語1を 数値変換し 数1と 合否に 入れ
  もし 合否が 真?
  ならば
   スタック2に スタック1を 入れ
   スタック1に 数1を 入れる
  つぎに

  nに 1を 加えて nに 入れる
 繰り返す
。

メインとは
 行は 文字列
 ソース名は 文字列
 起動引数(1)を ソース名に 入れ
 コードを クリアし
 1を コード数に 入れ
 ソース名で メモ帳を オープンし
 エラー?
 ならば
  エラー文字列で 重大エラーにし
 つぎに
 ここから
  メモ帳から 一行読み出し 行に 入れ
  データ終り?
  ならば
   打ち切り
  つぎに
  行を アセンブラし
 繰り返し
 メモ帳を クローズする
 RUNする
。





実行結果

>ore3 fizzbuzz.txt
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"

以上。

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