→をクリックすると非真理設定が非表示になります。ページを再読み込みすると戻ります。
値を複製する方法は分かりましたが、複製だけやっていてもあまり面白くありません。2003fは計算機なのですから、計算をしてもらわなくてはいけないでしょう。まずは足し算と引き算を行う方法を見ていきましょう。
f0
を13だけ増やす、つまり、13
という数値 [を](-'i) f0
[に](-'c) [足す](atakeses)には、次のように書きます。
ata 13 f0
このときf0
にはどんな値が入っているでしょうか?そう、「分からない」のです。もともとの値に比べて13だけ増えていることは確実ですが、[メモ](firjal)にどんな値が入っていたのかが全く分からないので分かりません。「明示的に値を設定していない[メモ](firjal)にはどんな値が入っているのかは一般に分からない」のでしたね。
f0
を37だけ減らす、つまり、37
という数値 [を](-'i) f0
[から](-'c) [減じる](ny atakeses)には、次のように書きます。
nta 37 f0
もちろん、[メモ](firjal)の値を[住所箱](setistafar)に足し合わせることもできます。
ata f0 f1@
ata 13 f0
で13が変更されたりしないのと同じように、この命令でf0
の値が変化することはありません。
なお、当然のことですが、数値を変更するような操作は許されません。
ata f2 3
練習として、住所4242149312にある値と、住所3274190944にある値を読み、それらの和を住所674147896に出力するようなプログラムを書くことを考えてみましょう。↓のように書けば正しく動くでしょうか?
kRz 4242149312 f0 kRz 3274190944 f1 ata f0 f1@ kRz f1@ 674147896
いいえ、これでは上手くいきません。まず、3行目でata f0 f1@
とありますが、これでは増分はf0
の値、つまり4242149312
という数になってしまい、4242149312
という住所にある値ではないからです。
では、こう直せばいいのでしょうか?
kRz 4242149312 f0 kRz 3274190944 f1 ata f0@ f1@ kRz f1@ 674147896
いいえ、まだダメです。どこが間違っているか分かりますか?
そう、これでは「数値を変更する」ような命令になってしまいますので、これまた正しく動きません。では、こうすればよいのでしょうか?
kRz 4242149312 f0 kRz 3274190944 f1 ata f0@ f1@ kRz 674147896 f2 kRz f1@ f2@
これはかなり惜しいところまで行っています。これは先程までの誤ったプログラムと違って、ちゃんと動いてくれます。ただし、思っていたのとは微妙に違う挙動になってしまうのです。さて、何が問題なのでしょう?
問題は、この操作の過程でf1@
の値が変更されてしまうことです。結果の出力先は住所674147896であって、住所3274190944の値をこっそり変更してしまっては困ります。
では、こう直せば今度こそ大丈夫でしょうか?
kRz 4242149312 f0 kRz 3274190944 f1 kRz 674147896 f2 kRz f1@ f3 kRz f0@ f2@ ata f3@ f2@
とても惜しい。誤植があります。kRz
したのはf3
ですがata
しているのはf3@
ですね?
じゃあこうすればいいのでしょうか?
kRz 4242149312 f0 kRz 3274190944 f1 kRz 674147896 f2 kRz f1@ f3@ kRz f0@ f2@ ata f3@ f2@
これは動きますが、マズいです。f3@
は[住所箱](setistafar)(しかもどの住所なのかよくわからない)で、そこを破壊してしまっているからです。
一時的な保管場所として使いたいのはf3@
ではなくf3
ですから、こうなります。
kRz 4242149312 f0 kRz 3274190944 f1 kRz 674147896 f2 kRz f1@ f3 kRz f0@ f2@ ata f3 f2@
これでやっと正しく動いてくれます。ふぅ。
なお、別解としては、次のような書き方もあります。
kRz 674147896 f2 kRz 0 f2@ kRz 4242149312 f0 ata f0@ f2@ kRz 3274190944 f1 ata f1@ f2@
この方法は、書き換えてやることでレジスタを節約できるという利点もあります。
kRz 674147896 f0 kRz 0 f0@ kRz 4242149312 f1 ata f1@ f0@ kRz 3274190944 f1 ata f1@ f0@
他にも、多少強引ですが「足してしまった分を引けば良い」という考えでこうしてやることもできます。
kRz 4242149312 f0 kRz 3274190944 f1 kRz 674147896 f2 ata f0@ f1@ kRz f1@ f2@ nta f0@ f1@
まあf1@
が書き込み不可だった場合に落ちるんですけど、まあ例外機構はまだ無いのでそんなことは気にしない気にしない