概要
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"
以上。