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

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

(1)

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

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

(2)

レジスタ

CC-RLはC言語関数呼び出しの前後において,一部のレジスタを除き,レジスタの値が同一であることを保証しません 。そのため,保持しなくてはならない値をレジスタに割り当てたままにしないでください。

(3)

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

CC-RLは「関数の戻り先アドレスは“スタック先頭”に格納される」ことを想定したコードを生成します。C言語関数へ分岐するとき,スタック先頭に関数の戻り先アドレスを格納する必要あります。

一般的には,call命令を使用して分岐することにより,関数の戻り先アドレスがスタック先頭に格納されます。