→をクリックすると非真理設定が非表示になります。ページを再読み込みすると戻ります。
前回は、数の大小を比較したり数を半分にしたりする方法を学びました。実践編であるksi.3では、今まで学んできた諸命令を元に実践的な処理を書いていきましょう。
まずは、簡単な処理として、最大値を求める[指令](cersva)を書いていきましょう。「先頭の番地」「先頭の番地+4」「先頭の番地+8」…と要素が「要素数」個ある一覧表を考え、この中の最大値をf0
に入れて終了する、という仕様にしましょう。なお、諸情報は次のように与えられているものとします。
自由 | 自由 | 戻る場所 | 数の一覧の先頭番地 | 要素数 |
なお、最大値を求める以上、要素数は0より大きいものとします。
nll lesloler kRz f5 f0 ata 4 f0 krz f0@ f1 ata 4 f0 kRz f0@ f2 …
ここで、わざわざ手間をかけf0
を作業用に使って要素数や先頭番地の情報を得ていますが、毎回このように書くのは面倒です。f5
から4だったり8だったり離れた位置にあるということは分かっていますし、定番の処理ですから、なんとか簡単に書けないでしょうか。
実は、次のように書くことができます。
nll lesloler krz f5+8@ f2 krz f5+4@ f1 …
これを使えば、指令に渡された情報を楽に受け取ることができます。
さて、要素数がf2
に入り、先頭番地がf1
に入ったので、処理を考えていきましょう。
まずは、最も単純な場合、つまり、要素数が1の場合を考えましょう。このときは、先頭番地にある値をf0
に入れ、即座に終了すればいいので、
nll lesloler krz f5+8@ f2 krz f5+4@ f1 krz f1@ f0 fi f2 1 clo malkrz f5@ xx …
となります。さて、要素数が1より大きかった場合ですが、とりあえず次の要素を見るべくf1
に4を足しましょう。
nll lesloler krz f5+8@ f2 krz f5+4@ f1 krz f1@ f0 fi f2 1 clo malkrz f5@ xx ata 4 f1 …
新しい要素とf0
を比較し、新しい要素のほうが大きければf0を更新します。
nll lesloler krz f5+8@ f2 krz f5+4@ f1 krz f1@ f0 fi f2 1 clo malkrz f5@ xx ata 4 f1 fi f1@ f0 llo malkrz f1@ f0 …
最後に、f2
の値を1減らし、要素数と1を比較するところに飛べば完成です。
nll lesloler krz f5+8@ f2 krz f5+4@ f1 krz f1@ f0 nll mak fi f2 1 clo malkrz f5@ xx ata 4 f1 fi f1@ f0 llo malkrz f1@ f0 nta 1 f2 krz mak xx
なお、nta 1 f2
の位置を変えて、このように書くこともできます。
nll lesloler krz f5+8@ f2 krz f5+4@ f1 krz f1@ f0 nll mak nta 1 f2 fi f2 0 clo malkrz f5@ xx ata 4 f1 fi f1@ f0 llo malkrz f1@ f0 krz mak xx