Renesas Synergy™

FAQ 1008111 : C言語で、0x1fffff番地以上離れたところにある関数を呼び出すにはどうすればよいですか?

回答

関数コールは jr 命令や jarl 命令を使用したコードが、Cコンパイラによって出力されます。
この命令でジャンプできる範囲は、22ビットディスプレースメントです。
(22bitディスプレースメント = -2097152~+2097151)

この範囲外に関数が存在した場合は、ジャンプが不可能なため、リンクでエラーになります。
これ以上のジャンプを実現するには jmp 命令を使用する必要があります。
それは、jmp 命令は引き数であるレジスタ値をそのまま使うため、 32ビット範囲のジャンプが可能だからです。
Cコンパイラに関数コールを jmp 命令で出力させるには、far jump 機能か、関数ポインタを使用します。

例) 関数ポインタの場合
func関数と sub関数が22ビット範囲内に収まっていなくても、呼び出しが可能です。

------------------------------
void sub(void);
void (*volatile sub_p)(void);

void func(void) {
    sub_p = sub;
    (*sub_p)();
}
------------------------------




適用製品

V850用コンパイラパッケージ [CA850]
他にご質問がございましたら、リクエストを送信してください