条件判断機能の規則に do-if-true というものがある. これはある条件の真偽を判定して, 結果が真ならば次のプログラム行 (条件文の次の行) にある命令を実行し, 結果が偽であれば次のプログラム行を飛び越すという規則である.
HP-42S のプログラムの実行において, プログラムポインターが条件判断機能に出会ったときには do-if-true 規則にしたがって処理が行われる.
条件判断機能には
・ フラグテスト ── HP-42S が提供している 100 個のフラグ ($00 - 99$) のいずれかについて, それがセットされているかどうかを調べてその結果に応じた処理を行う
・ 比較 ── $\mathrm{X}$ レジスターの内容を $0$ と比較する, あるいは $\mathrm{X}$ レジスターの内容と $\mathrm{Y}$ レジスターの内容を比較する
・ データ形式の比較 ── $\mathrm{X}$ レジスターにどのようなデータ (実数・複素数・行列・英数文字列) が入っているかをテストする
・ ビットテスト ── ある数値データの 1 つのビットが 1 かどうかをテストする
がある.
以下は, 条件判断機能のうち, $\mathrm{X}$ レジスターの内容と $\mathrm{Y}$ レジスターの内容を比較する機能を使って $0$ から $N$ までの整数の和を求めるプログラムである. 条件判断機能とループ処理を組み合わせている. 条件判断機能の理解のために, 公式 $N(N+1)/2$ を使わずに書いている.
● $0$ から $N$ までの和を求めるプログラム
プログラム "SUM" は $\mathrm{X}$ レジスターに数 $N$ が入った状態で呼び出す. 実行が終了すると計算結果が $\mathrm{X}$ レジスターに保存され, スタックが上昇して最初に $\mathrm{X}$ レジスターに入っていた $N$ は $\mathrm{Y}$ レジスターに移動する.
プログラムの実行中は $\mathrm{X}$ レジスターをカウンター変数として使用する. 計算の途中および最終の結果は記憶レジスター $\mathrm{R}_{00}$ に格納する.
\begin{alignat*}{2}
\newcommand{\Ar}[1]{\mathrm{Ar}(#1)}
\newcommand{\Arr}[1]{\mathrm{Arr}(#1)}
\newcommand{\Card}{\text{card}}
\newcommand{\Cdot}{\,\cdot^{\mathrm{op}}}
\newcommand{\Cocone}{\mathrm{Cocone}}
\newcommand{\Colim}{\mathrm{colim}\,}
\newcommand{\CommaCat}[2]{(#1/#2)}
\newcommand{\Cone}{\mathrm{Cone}}
\newcommand{\Eqclass}[4]{{#1#2#3}_{#4}}
\newcommand{\EqCls}[2]{{\left[#1\right]}_{#2}}
\newcommand{\Eqcls}[1]{\left[#1\right]}
\newcommand{\FnRest}[2]{{#1}|{#2}}
\newcommand{\Func}[2]{\mathrm{Func}(#1,#2)}
\newcommand{\g}{\varg}
\newcommand{\Hom}{\mathrm{Hom}}
\newcommand{\Id}[1]{\mathrm{id}_{#1}}
\newcommand{\In}{\mathrm{incl}}
\newcommand{\Inc}[2]{\mathrm{incl}\left(#1,#2\right)}
\newcommand{\Incl}[2]{\mathrm{incl}_{#1}^{#2}}
\newcommand{\InclArrow}[2]{\morphism(0,0)/>->/<450,0>[\Incl{#1}{#2} : {#1}\,\,`{#2};]}
\newcommand{\Lb}[1]{\mathrm{lb}(#1)}
\newcommand{\Lowerset}[1]{\downarrow\!\!{#1}}
\newcommand{\Mb}[1]{\mathbf{#1}}
\newcommand{\Mbb}[1]{\mathbb{#1}}
\newcommand{\Mr}[1]{\mathrm{#1}}
\newcommand{\Ms}[1]{\mathscr{#1}}
\newcommand{\Mt}[1]{\mathtt{#1}}
\newcommand{\Mub}[1]{\mathrm{mub}(#1)}
\newcommand{\Nat}{\mathrm{Nat}}
\newcommand{\Ob}[1]{\mathrm{Ob}(#1)}
\newcommand{\Opp}[1]{{#1}^{\mathrm{op}}}
\newcommand{\Prj}[2]{\mathrm{proj}\left(#1,#2\right)}
\newcommand{\Proj}[2]{\mathrm{proj}^{#1}_{#2})}
\newcommand{\Pw}{\mathbf{P}}
\newcommand{\q}{\hspace{1em}}
\newcommand{\qq}{\hspace{0.5em}}
\newcommand{\Rel}[1]{\langle{#1}\rangle}
\newcommand{\Rest}[2]{{#1}|{#2}}
\newcommand{\SkelCat}[1]{\mathrm{sk}(#1)}
\newcommand{\Slash}[1]{{\ooalign{\hfil/\hfil\crcr$#1$}}}
\newcommand{\SliCat}[2]{{#1}\,\big/\,{#2}}
\newcommand{\Src}{d^{0,\mathrm{op}}}
\newcommand{\Sub}{\mathrm{Sub}}
\newcommand{\ssqrt}[1]{\sqrt{\smash[b]{\mathstrut #1}}}
\newcommand{\Tgt}{d^{1,\mathrm{op}}}
\newcommand{\TwArCat}[1]{\mathrm{Tw}(#1)}
\newcommand{\Ub}[1]{\mathrm{ub}(#1)}
\newcommand{\Upperset}[1]{\uparrow\!\!{#1}}
\newcommand{\VectCat}[1]{#1 \mathchar`- \mathbf{Vect}}
\newcommand{\Grp}{\mathbf{Grp}}
\newcommand{\Mon}{\mathbf{Mon}}
\newcommand{\POs}{\mathbf{Pos}}
\newcommand{\Psh}{\mathbf{Psh}}
\newcommand{\Set}{\mathbf{Set}}
\newcommand{\Sh}{\mathbf{Sh}}
\newcommand{\Top}{\mathbf{Top}}
\newcommand{\A}{\mathscr{A}}
\newcommand{\B}{\mathscr{B}}
\newcommand{\C}{\mathscr{C}}
\newcommand{\D}{\mathscr{D}}
\newcommand{\E}{\mathscr{E}}
\newcommand{\F}{\mathscr{F}}
\newcommand{\sH}{\mathscr{H}}
\newcommand{\I}{\mathscr{I}}
\newcommand{\J}{\mathscr{J}}
\newcommand{\K}{\mathscr{K}}
\newcommand{\sL}{\mathscr{L}}
\newcommand{\M}{\mathscr{M}}
\newcommand{\N}{\mathscr{N}}
\newcommand{\sO}{\mathscr{O}}
\newcommand{\sP}{\mathscr{P}}
\newcommand{\R}{\mathscr{R}}
\newcommand{\sS}{\mathscr{S}}
\newcommand{\T}{\mathscr{T}}
\newcommand{\U}{\mathscr{U}}
\newcommand{\V}{\mathscr{V}}
\newcommand{\W}{\mathscr{W}}
\newcommand{\X}{\mathscr{X}}
\newcommand{\Y}{\mathscr{Y}}
\newcommand{\Z}{\mathscr{Z}}
01 & \qq\Mr{LBL}\qq\Mr{"SUM"} & \hspace{4em} & ; \text{グローバルラベル: プログラム名 "SUM".} \\
~ & ~ & ~ & ; \text{呼び出された時点で X レジスターには } N \text{ が入っている.} \\
02 & \qq 0 & ~ & ; \text{カウンターとして使用する X レジスターを 0 で初期化する.} \\
~ & ~ & ~ & ; \text{X レジスターに入っていた } N \text{ はスタックの上昇により Y レジスターに移動する.} \\
03 & \qq\Mr{STO}\qq 00 & ~ & ; \text{結果を入れる記憶レジスター } \Mr{R}_{00} \text{ を 0 で初期化する.} \\
04 & \qq\Mr{LBL}\qq 00 & ~ & ; \text{X レジスターの内容と Y レジスターの内容の比較判定処理のローカルラベル 00.} \\
05 & \qq\Mr{X\!>\!\!Y?} & ~ & ; \text{カウンター (X レジスターの内容) と } N \text{ (Y レジスターの内容) の比較.} \\
~ & ~ & ~ & ; \text{カウンターは } N \text{ より大きいかのテスト.} \\
06 & \qq\Mr{GTO}\qq 01 & ~ & ; \text{カウンターが } N \text{ より大きければ終了処理へ分岐する.} \\
07 & \qq\Mr{STO}+ \qq 00 & ~ & ; \Mr{R}_{00} \leftarrow \text{(現在の } \Mr{R}_{00} \text{ の内容)}+\text{(カウンター)}. \\
08 & \qq 1 & ~ & ; \text{08 行と 09 行でカウンター (X レジスターの内容) に 1 を加える.} \\
09 & \qq + & ~ & ; \\
10 & \qq\Mr{GTO}\qq 00 & ~ & ; \text{比較判定処理へ分岐する.} \\
11 & \qq\Mr{LBL}\qq 01 & ~ & ; \text{終了処理のローカルラベル 01.} \\
12 & \qq\Mr{R}\!\downarrow & ~ & ; \text{スタックを下降させて現在 Y レジスターに入っている } N \text{ を X レジスターに移動する.} \\
13 & \qq\Mr{RCL}\qq 00 & ~ & ; \text{最終の計算結果 } \Mr{R}_{00} \text{の内容を X レジスターに入れる.} \\
~ & ~ & ~ & ; \text{スタックの上昇により X レジスターに入っていた } N \text{ は Y レジスターに移る.} \\
14 & \qq\Mr{RTN} & ~ & ; \text{リターン命令. 呼び出し元に処理を返す.} \\
\end{alignat*} 時間はかかったが, 動くプログラムを書くことができた.
少しづつだが HP-42S でのプログラミングへの理解が深まってきたと思う. 機械がどう動くかもだんだんイメージすることができるようになってきてかなり楽しい. またプログラミングの喜びを感じることができるようになるかも知れない.
マニュアルでは, ここから先は本格的なプログラム例が取り扱われているので一つづつ勉強していく.
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image