印刷 - Renesas

2-3-4 テーブルジャンプ
サブルーチン呼び出し、C言語では関数呼び出しは JSR 命令または BSR 命令を利用します。
BSR 命令はプログラムカウンタ相対で、呼び出し可能な範囲は8ビットまたは 16 ビットです。指定し
なかった場合はアセンブラが自動的に判断し、戻る場合は最適なサイズを、先へ進む場合は 16 ビット
を利用します。BSR 命令は PC 相対のため、位置独立(ポジションインディペンデント)
、つまりアセ
ンブル、リンク時のアドレスに関係なくメモリに記憶できます。
JSR 命令は絶対アドレス分岐命令です。指定したアドレスが PC にセットされます。
JSR 命令と JMP 命令はアドレス指定に汎用レジスタまたはメモリ間接を利用でき、テーブルによる分
岐が可能です。
このような課題があったとます。
この課題にあった処理アルゴリズムはいくつかあります。
CMP 命令を使い、比較する方法では DATA の下位 2 ビットを 4 回比較します。
但し、この処理は AND 命令で結果が 0 かは分かるので必要ありません。また、この処理も 0 から 3 以
外のデータは存在し得ないので不要です。
このアルゴリズムは呼び出し回数に偏りがある場合に有効です。このプログラムでは SUB0 を呼ぶと高
速です。
もう 1 つの処理方法は、テーブルジャンプです。データをサブルーチンの先頭番地へテーブルを使って
変換するのです。
シンボル TABLE からサブルーチンの先頭番地を登録します。
SUB1 は TABLE+4 番地へ、SUB3 は TABLE+12 番地へ登録されました。
もし同じファイルにサブルーチン本体が記述されていないなら.IMPORT 制御命令でインポートしてお
きます。
汎用レジスタ ER0 にジャンプ先アドレスを作成し、JSR@ER0 を利用し呼び出します。DATA 番地の
内容を TABLE 番地からのオフセットアドレスに変換するため、下位2ビットのみとし、その後4倍し
ます。ディスプレースメント付レジスタ間接でサブルーチンの先頭アドレスを取得します。この時汎用
レジスタ ER0 は TABLE+ER0 番地から取り出した結果に更新されます。つまり MOV 命令実行前はオ
フセットアドレスが記憶されていますが、実行後は SUB0 から SUB3 のどれかが記憶されています。
この様に同じ汎用レジスタを利用しても構いません。他の汎用レジスタでも構いません。またオフセッ
トアドレスに利用した ER0 は 32 ビット全てが演算対象となりますから SUB 命令で汎用レジスタ ER0
をクリアします。
このアルゴリズムは呼び出し回数に偏りがある場合に有効です。また拡張性がある方法です。