mindの研究 その76

# 概要
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は　文字列
　単語2は　文字列
　数2は　変数
　ｎは　変数
　ラベルに　入れ
　ｎに　１を　入れ
　数2に　5を　入れ
　ここから
　　もし　ｎが　コード数より　大きい
　　ならば
　　　打ち切り
　　つぎに
　　コード（ｎ）を　文字列１に　入れ
　　文字列１から　単語切り出し　単語1に　入れ
　　文字列１から　単語切り出し　単語2に　入れ
　　もし　単語1が　ラベルに　等しい文字列
　　ならば
　　　ｎを　数２に　入れ
　　　打ち切り
　　つぎに
　　ｎに　１を　加えて　ｎに　入れ
　繰り返す
　数2を　返す
。

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

　　もし　単語1が　「rnd」に　等しい文字列
　　ならば
　　　乱数に　５を　掛け　乱数に　入れる
　　　乱数に　１を　引き　乱数に　入れる
　　　乱数を　スタック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」に　等しい文字列
　　　ならば
　　　　ｂに　スタック1を　入れる
　　　　スタック1に　スタック2を　入れ
　　　つぎに
　　つぎに

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

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

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

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

　　もし　単語1を　数値変換し　数１と　合否に　入れ
　　もし　合否が　真？
　　ならば
　　　スタック2に　スタック1を　入れ
　　　スタック1に　数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"
```

以上。