2003lk入門

トップに戻る

をクリックすると非真理設定が非表示になります。ページを再読み込みすると戻ります。


ksi.2 基礎的な命令

lexn.5 fimalkRz

繰り返しから途中で抜けるには、どうすればいいでしょう?

繰り返しというのは同じ命令列をひたすら実行していくことを指すのですから、そこから抜け出すには「状態に応じて、繰り返しの外に抜け出したり抜け出さなかったりする」ということを記述できる必要があるわけです。そのために用意されている命令がfimalkRzです。

fimalkRzは組として使う命令で、次のように使います。

fi f0 0 niv
malkRz 5 f1

これはつまり「[もしf0が0でなければ、5をf1に複製せよ](fi f0 es 0 niv, mal krantairzarth 5'i f1'c.)」という意味です。

逆に、「f0が0である」という場合はどう書くのでしょうか?次のように書きます。

fi f0 0 clo
malkRz 5 f1

このcloというのは「[同等だ](ce loler)」の省略です。「[もしf0が0と等しければ、](fi f0 es 0 ce loler)」、ということですね。

fi f0 0
malkRz 5 f1

とは書けないので注意しましょう。

また、

fi f0 0 clo
malkRz 5 f1

の代わりに

fi f0 0 clo
kRz 5 f1

と書いてしまうと、malkRzと違ってkRzは無条件での複製を行う命令なので、これは

f0は0と等しいだろうか?さてそんなことはどうでもよく、f1に5を入れてくれ」という命令になってしまいます。とてもありがちな誤りなので、十分注意しましょう

さて、まずはこれを使って、f1の値の67倍をf2に入れる命令列を書いてみましょう。

いや、もちろん2003lkには掛け算命令もありますよ

もちろん、一番簡単なのは次のように書くことですが、

kRz 0 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2   ata f1 f2
ata f1 f2   ata f1 f2

これでは面白みがないので、ちゃんと繰り返しを使って書いていきましょう。

例えば、このように書くことができます。

kRz 0 f0
kRz 0 f2
nll polta1
ata f1 f2
ata 1 f0
fi f0 67 niv
malkRz polta1 xx

では、これを応用して、次のような実用的な課題を考えてみましょう。

「4187375140番地・4187375144番地・4187375148番地 … と番地を4ずつ増やして見ていって、住所箱のそこの値がf0の値と一致するならばその番地を、f1個探しても見つからなかったら0を、1923108072番地に書き込む。複数見つかった場合は、どの番地を知らせても良い。」

要するに、住所箱を見て、そのお隣さんを次々と調べていって、目的とする値を検索していくという課題です。

さて、このような問題に対していきなり完璧に対応しようとするとうまくいきません。まずは、課題の部分部分を考えるところから始めてみましょう。

まず、「4187375140番地を見て、f0の値と一致するなら1923108072番地に4187375140と書き込む」はどう書けばいいでしょうか?

kRz 4187375140 f3
kRz 1923108072 f2
fi f3@ f0 clo
kRz 4187375140 f2@

と書くことで実現できます。

ここで、最後の行においてもf3には4187375140という値が入ったまま(「4187375140番地の値」ではない!)であることに注意すると、次のようにも書けることが分かります。

kRz 4187375140 f3
kRz 1923108072 f2
fi f3@ f0 clo
kRz f3 f2@

これで第1段階は解決です。次に、この直後に「4187375144番地を見て、f0の値と一致するなら1923108072番地に4187375144と書き込む」という処理を行うには、

kRz 4187375140 f3
kRz 1923108072 f2
fi f3@ f0 clo
kRz f3 f2@

kRz 4187375144 f3
kRz 1923108072 f2
fi f3@ f0 clo
kRz f3 f2@

と書けばいいわけです。

ここで、5行目の段階ではf3には4187375140という値が入ったままであり、f2には1923108072という値が入ったままであることを考えると、このように書けます。

kRz 4187375140 f3
kRz 1923108072 f2
fi f3@ f0 clo
kRz f3 f2@

ata 4 f3
fi f3@ f0 clo
kRz f3 f2@

ここにちゃんとした説明を入れる。レジスタが足りないのでループカウンタに転用する話とか書きましょうね。

最終的に、

kRz 4187375140 f3
kRz 1923108072 f2
kRz 0 f2@
nll polta1
fi f3@ f0 clo
kRz f3 f2@
ata 4 f3
nta 1 f1
fi f1 0 niv
malkRz polta1 xx

というのが正解の一つとなるわけです。


前のページへ   次のページへ