アフィリエイト広告を利用しています

2019年02月05日

HP-42S: 分岐命令 ── GTO 命令

細々と続けている HP-42S でのプログラミングの勉強だが, ようやく少し進展した.

毎日, 少しづつでも続けていると理解できる日は来るものだ.

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}$ は実行されない.
つまり, ビープ音は一度しか鳴らない.
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

この記事へのトラックバックURL
https://fanblogs.jp/tb/8533449

この記事へのトラックバック
ファン
検索
<< 2024年10月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
最新記事
最新コメント
眼科の定期検査 〜 散歩 by コトタマ (02/15)
眼科の定期検査 by 三文字寄れば文殊のヒフミヨ (09/21)
本を読んで過ごす by 底彦 (12/13)
本を読んで過ごす by ねこ (12/12)
数学の計算をする by 底彦 (12/04)
タグクラウド
カテゴリアーカイブ
仕事(59)
社会復帰(22)
(43)
コンピューター(211)
(1417)
借金(8)
勉強(13)
(12)
数学(97)
運動(8)
日常生活(1387)
(203)
健康(37)
読書(20)
プロフィール

ブログランキング・にほんブログ村へ
にほんブログ村
にほんブログ村 メンタルヘルスブログ うつ病(鬱病)へ
にほんブログ村
にほんブログ村 科学ブログ 数学へ
にほんブログ村
にほんブログ村 IT技術ブログ プログラム・プログラマーへ
にほんブログ村