コール

命令形式

          // 相対コール
[ IF <cond> ] CALL <ofst13> [ (DB) ];
CALL <ofst16> [(DB)];

          // ロングコール(絶対アドレス)
[ IF <cond> ] LCALL <imm24>;

          // 間接コール
[ IF <cond> ] CALL (<ireg>) [ (DB) ];

          // 相対コール
IF NE CALL call_target;       // ラベル "jump_target" へ分岐
IF EQ CALL jump_target (DB);  // 遅延分岐
CALL jump_target;             // 無条件分岐

          // ロングコール
LCALL jump_target;

          // 間接コール
CALL (I7) (DB);

説明

コール命令です。実行すると、命令実行アドレスが変わります。同時にコール命令の次の命令番地をPCスタックに積みます。

コール命令はサブルーチン呼び出しに使います。PCスタックは33エントリーの内蔵スタックで、コール命令、割り込み、DO命令が共用します。つまり、これら三者の入れ子の合計は33レベルまで許されます。スタックの入れ子についての詳細はADSP-2191 HRM 3-34ページ、"Stack and Sequencing"を参照してください。

コール命令で呼ばれたサブルーチンから戻るには、RTS命令を実行します。

コール先アドレスをPC相対で表すか絶対番地で表すかは命令によって変わります。ただし、プログラマはこれを意識する必要はありません。必要な形式の選択はアセンブラが自動的に行うからです。プログラマは単にコール先のラベルを与えてください。

間接コールを行う場合、IREGが与えるのは下位16ビットのアドレスだけです。上位8ビットはIJPGレジスタによって与えられます。

パイプライン・アーキテクチャーを採っているため、コール命令は必ずストールを起こします。コール命令の実行には5サイクルかかるため、4サイクルのストールが生じます。

(DB)オプションをつけると、遅延分岐を行います。この場合、コール命令の次の2命令を無条件に実行するため、ストールが2サイクルに緩和されます。遅延分岐を行う時に注意が必要なのは即値DMストア命令と即値PMストア命令です。この二つは2ワード命令であるため、2命令分の場所を占有してしまいます。この命令を遅延スロットで実行する場合には遅延スロットの1スロット目に配置してください。なお、遅延スロットには以下の命令を置くことはできません。

ジャンプ命令実行時のオーバーヘッドや制限についての詳細はISRの8-30ページと、HRMの3-13ページ"Branches and Sequencing"を参照してください。

文法要素

<ofst13> ::= 13ビット即値による、コール先への相対オフセット
<imm24> ::= 24ビット即値による、コール先絶対番地
<ireg>  ::= I0, I1, I2, I3, I4, I5, I6, I7
<cond>  ::= EQ, NE, GT, LE, LT, GE, AV, NOT AV, AC, NOT AC,
            SWCOND, NOT SWCOND, MV, NOT MV, NOT CE, TRUE
2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |