// 相対コール [ 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