毎日, 少しづつでも続けていると理解できる日は来るものだ.
HP-42S は, 実行中のプログラムを分岐させてサブルーチンまたは他のプログラムを実行するための分岐命令を備えている.
\begin{equation*}
\newcommand{\Ar}[1]{\mathrm{Ar}(#1)}
\newcommand{\ar}{\mathrm{ar}}
\newcommand{\arop}{\Opp{\mathrm{ar}}}
\newcommand{\Cocone}[2]{\mathrm{Cocone}(#1,#2)}
\newcommand{\Colim}{\mathrm{colim}}
\newcommand{\CommaCat}[2]{(#1 \downarrow #2)}
\newcommand{\Cone}[2]{\mathrm{Cone}(#1,#2)}
\newcommand{\Func}[2]{\mathrm{Func}(#1,#2)}
\newcommand{\Hom}{\mathrm{Hom}}
\newcommand{\Id}[1]{\mathrm{id}_{#1}}
\newcommand{\Mb}[1]{\mathbf{#1}}
\newcommand{\Mr}[1]{\mathrm{#1}}
\newcommand{\Ms}[1]{\mathscr{#1}}
\newcommand{\Mt}[1]{\mathtt{#1}}
\newcommand{\Nat}[2]{\mathrm{Nat}(#1,#2)}
\newcommand{\Ob}[1]{\mathrm{Ob}(#1)}
\newcommand{\Opp}[1]{{#1}^{\mathrm{op}}}
\newcommand{\Pos}{\mathbf{Pos}}
\newcommand{\q}{\hspace{1em}}
\newcommand{\qq}{\hspace{0.5em}}
\newcommand{\Rest}[2]{{#1}|{#2}}
\newcommand{\Sub}{\mathrm{Sub}}
\newcommand{\Src}{d^{0,\mathrm{op}}}
\newcommand{\Tgt}{d^{1,\mathrm{op}}}
\Mr{GTO}, \quad \Mr{XEQ}
\end{equation*} の 2 つである.
分岐命令により, プログラムポインターは, 現在のプログラム行の次の行以外の行へ処理を移す.
$\Mr{GTO}$ 命令は, メモリー内のラベルへ処理を移す. いわゆる $\Mr{goto}$ 命令に相当する.
$\Mr{XEQ}$ 命令も, メモリー内のラベルへ処理を移すが, 移動先で $\Mr{RTN} \qq (\Mr{return})$ 命令が実行されると呼び出した $\Mr{XEQ}$ 命令の次の行に処理を戻す. つまり, 戻り位置を記憶していて, いわゆるサブルーチン呼び出しに相当する.
一方移動先で $\Mr{END}$ 命令が実行されるとその時点で処理は完結してプログラムの実行は停止する. 呼び出し元に処理は戻らない.
メモリー内のラベルには, グローバルラベル (プログラム名など) とローカルラベル (プログラム内のラベル) の二種類がある.
グローバルラベルには, メモリーの何処からでもアクセスできるが, ローカルラベルにはそのプログラム内からしかアクセスできない.
$\Mr{GTO}$ 命令を使用する場合にもこの制限は同じである. その結果, 以下の 3 通りの形式によって呼び出しを行うことができることになる.
(1) $\Mr{GTO} \qq nn$: 数値のローカルラベル $nn$ に分岐する ここで, $nn$ はラベル番号で $\Mt{00},..., \Mt{99}$ のいずれかである;
(2) $\Mr{GTO} \qq label$: 英数文字のローカルラベルに分岐する. ここで, $label$ は 1 文字の英字 $\Mt{A},..., \Mt{J}$ または $\Mt{a},..., \Mt{e}$ のいずれかである;
(3) $\Mr{GTO} \qq "label"$: グローバルラベル $"label"$ に分岐する (ここで, $"label"$ は ALPHA ラベル, 即ち 1 〜 7 桁の英数文字列である)
■ サンプルプログラム
以下のような二つのプログラム $\text{"PRG1"}$, $\text{"PRG2"}$ を考える.
\begin{align*}
& 01 \q \Mr{LBL} \qq \text{"PRG1"} & \q & ; \text{グローバルラベル: PRG1.} \\
& 02 \q \Mr{GTO} \qq \text{"PRG2"} & & ; \text{グローバルラベル "PRG2" に分岐.} \\
& 03 \q \Mr{TONE} \qq \Mr{0} & & ; \text{ビープ音を鳴らす. トーン番号 0 の音が鳴る.} \\
& 04 \q \Mr{END} & & \\
& & & \\
& 01 \q \Mr{LBL} \qq \text{"PRG2"} & & ; \text{グローバルラベル: PRG2.} \\
& 02 \q \Mr{TONE} \qq \Mr{9} & & ; \text{ビープ音を鳴らす. トーン番号 9 の音が鳴る.} \\
& 03 \q \Mr{END} & &
\end{align*}
1 番目のプログラム $\text{"PRG1"}$ を
\begin{equation*}
\Mr{XEQ} \qq \text{"PRG1"}
\end{equation*}により実行すると $\Mr{02}$ 行目の $\Mr{GTO}$ 命令により処理がグローバルラベル $\text{"PRG2"}$ に分岐する. プログラム $\text{"PRG2"}$ の $\Mr{02}$ 行目の $\Mr{TONE} \qq \Mr{9}$ によって, トーン番号 $9$ に対応するビープ音が鳴る. $\Mr{03}$ 行目の $\Mr{END}$ 命令によって全体の処理が完結する.
呼び出し元のプログラム $\text{"PRG1"}$ の $\Mr{03}$ 行目にある $\Mr{TONE} \qq \Mr{0}$ は実行されない.
つまり, ビープ音は一度しか鳴らない.
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image