9.3 アセンブリ言語からC言語ルーチンの呼び出し

アセンブラ関数からC言語関数を呼び出すときの注意点について説明します。

(1)

スタック・フレームについて

CC-RHは「スタック・ポインタ(SP)が,常にスタック・フレームの最下位アドレスを指している」ことを想定したコードを出力します。そのため,アセンブラ関数からC言語関数へ分岐する前に,スタック領域中の未使用領域の上位アドレスを指すようにSPを設定してください。これは下位アドレスの方向にスタック・フレームが取られるためです。

(2)

作業用レジスタ

CC-RHはC言語関数呼び出しの前後において,レジスタ変数用レジスタの値は保持しますが,作業用レジスタの値は保持しません。そのため,保持しなくてはならない値を作業用レジスタに割り当てたままにしないでください。

レジスタ変数用レジスタ,作業用レジスタは,レジスタ・モードにより異なります。

表 9.3

レジスタ変数用レジスタ

レジスタ・モード

レジスタ変数用レジスタ

22レジスタ・モード

r25,r26,r27,r28,r29

32レジスタ・モード

r20,r21,r22,r23,r24,r25,r26,r27,r28,r29

表 9.4

作業用レジスタ

レジスタ・モード

作業用レジスタ

22レジスタ・モード

r10,r11,r12,r13,r14

32レジスタ・モード

r10,r11,r12,r13,r14,r15,r16,r17,r18,r19

(3)

アセンブラ関数への戻り先アドレス

CC-RHは「関数の戻り先アドレスは“リンク・ポインタlp(r31)”に格納される」ことを想定したコードを生成します。C言語関数へ分岐するとき,lpに関数の戻り先アドレスを格納する必要あります。

一般的にはjarl命令によって,C言語関数へ分岐します。