\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}}
\Mr{GTO}\qq & 99 & \hspace{4em} & ; \text{ラベル 99 への分岐}. \\
\Mr{XEQ}\qq & \text{"SAREA"} & & ; \text{ラベル "SAREA" への分岐}
\end{alignat*} という 2 つの命令を例として考える.
最初の $\Mr{GTO}\qq 99$ という命令は, 現在実行されているプログラム内のどこかにある $99$ というローカルラベルへの分岐 (goto) である. 2 番目の $\Mr{XEQ}\qq \text{"SAREA"}$ という命令は, プログラムメモリー空間内のどこかにある (何らかの処理を行うプログラムに付けられた) $\text{"SAREA"}$ というグローバルラベルへの分岐 (サブルーチン呼び出し) である.
$\Mr{GTO}$ 命令あるいは $\Mr{XEQ}$ 命令による分岐は, そのパラメーターがローカルラベルであるかグローバルラベルであるかによって動作が若干異なる.
● ローカルラベルへの分岐
分岐命令のパラメーターとしてローカルラベル (たとえば $99$) が指定された場合, HP-42S は現行プログラム内でこのローカルラベル $99$ を検索する. 検索の仕方は次のようになる.
1) 現在のプログラムポインターの位置から下方向に順番に検索していく.
2) プログラムの末尾に到達しても指定したラベルが見つからない場合は, 今度はプログラムの先頭からプログラムポインターの位置まで順番に検索する.
3) 1), 2) のいずれかによって指定したラベルが見つかった場合, プログラムポインターがそのラベルの行に移動し, そこからプログラムの実行が継続される.
4) 1), 2) のいずれによっても指定したラベルが見つからない場合は,
\begin{equation*}
\Mt{Label~Not~Found}
\end{equation*} というエラーメッセージを表示してプログラムは実行を停止する.
この仕組みにより, ローカルラベルの検索にかかる時間は
・ プログラムの長さ,
・ プログラムポインターからそのローカルラベルまでの距離
に依存して変化する. HP-42S では, 検索時間を短くするために, $\Mr{GTO}$ 命令または $\Mr{XEQ}$ 命令から指定したローカルラベルまでの距離を記憶する. つまり $\Mr{GTO}$ 命令または $\Mr{XEQ}$ 命令の一部として内部的にローカルラベルまでの距離が保存される. これによって一つの $\Mr{GTO}$ 命令, $\Mr{XEQ}$ 命令に付随するローカルラベルの検索処理は最初の一回のみ行えばよく, プログラムの実行時間が短縮される.
※: ラベルまでの距離について
ローカルラベルには, 数字と英字の二種類がある.
・ 数字ラベルは 2 桁の数字 ($00$ 〜 $99$) で表わされる. 数字ラベルのうち, 特に $00$ 〜 $14$ の 15 個は, メモリーの使用量が少なくて済むので, 短縮形のローカルラベル (short form local label) と呼ばれる.
・ 英字ラベル (ALPHA ラベル) は 1 桁の英字を使用し, $\Mr{A}$ 〜 $\Mr{J}$, $\Mr{a}$ 〜 $\Mr{e}$ の 15 個いずれかで表わされる.
ローカルラベルまでの距離の制限は次のように定まっている.
(a) 短縮形のローカルラベルの場合は $128=2^7$ バイトまで.
(b) その他のローカルラベルの場合は $4,096=2^{12}$ バイトまで.
ちなみに HP-42S の全メモリー空間の大きさは $8,192=2^{13}$ バイトである. そのうちのプログラムメモリー空間の大きさと境界は定義された変数の量や現在使用中のメモリー量に依存して動的に変化する.
もしも, ローカルラベルまでの距離が $4,096$ バイト (短縮形ローカルラベルの場合は $128$ バイト) を超えてしまった場合には, $\Mr{GTO}$ 命令または $\Mr{XEQ}$ 命令の一部としてローカルラベルまでの距離を保存しておくことができないため, 命令の実行毎に検索処理が行われる. だからプログラムを少しでも速くするためには, ローカルラベルは分岐命令のなるべく近くに置くようにする.
● グローバルラベルへの分岐
グローバルラベルへの分岐が指定された場合には, 検索の仕方は次のようになる.
1) 最後のグローバルラベル (メモリー空間内のプログラムメモリーの一番後ろにあるグローバルラベル) から始めて上方向にラベルの検索を行う.
2) 指定したラベルが見つかった場合, プログラムポインターがそのラベルの行に移動し, そこからプログラムの実行が継続される.
3) 指定したラベルが見つからなかった場合は,
\begin{equation*}
\Mt{Label~Not~Found}
\end{equation*} というエラーメッセージを表示してプログラムは実行を停止する.
HP-42S のマニュアルには, このような分岐を効率的に処理するための仕組みまで丁寧に書いてある. こういう構造的なことがわかるのは面白い.
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image