Cからのアセンブラルーチンの呼び出し
C から呼び出すアセンブラルーチンは、以下を満たしている必要があります。
呼び出し規約に準拠していること
PUBLICエントリポイントラベルがあること型チェックやパラメータの型変換(オプション)を可能にするため、以下の例のようにすべての呼び出しの前に external として宣言されていること
extern int foo(void);または
extern int foo(int i, int j);
これらの条件を満たすことを知る1つの方法は、C でスケルトンコードを作成してコンパイルし、アセンブラリストファイルを調べることです。
スケルトンコードの作成
正しいインタフェースを持つアセンブラ言語ルーチンを作成するには、Cコンパイラで作成されたアセンブラ言語ソースファイルから開始することをお勧めします。
注記
関数プロトタイプごとにスケルトンコードを作成する必要があります。
以下の例は、ルーチン本体を簡単に追加できるスケルトンードの作成方法を示します。スケルトンソースコードで必要な処理は、必要な変数を宣言し、それらにアクセスするだけです。この例では、アセンブラルーチンは int、charを引数に指定し、int を返します。
extern int gInt;
extern char gChar;
int Func(int arg1, char arg2)
{
int locInt = arg1;
gInt = arg1;
gChar = arg2;
return locInt;
}
int main()
{
int locInt = gInt;
gInt = Func(locInt, gChar);
return 0;
}注記
この例では、ローカル変数とグローバル変数のアクセスを示すため、コードのコンパイル時の最適化レベルを低くしています。最適化レベルを高くすると、ローカル変数への必要な参照が最適化で削除される場合があります。最適化レベルによって実際の関数宣言が変更されることはありません。
スケルトンコードのコンパイル
注意
IDEにおいて、リストオプションをファイルレベルで指定します。[ワークスペース]ウィンドウでファイルを選択します。次に、[プロジェクト]>[オプション]を選択します。[C/C++コンパイラ]カテゴリで、[継承した設定をオーバライド]を選択します。[リスト]ページで[リストファイルの出力]の選択を解除し、代わりに[アセンブラファイルの出力]オプションおよびそのサブオプション[ソースのインクルード]を選択します。また、低い最適化レベルを指定します。
危険
スケルトンコードをコンパイルするには、以下のオプションを使用します。
iccarm skeleton.c -lA . -On -e-lAオプションは、アセンブラ言語出力ファイルを作成します。このファイルでは、C/C++ ソース行がアセンブラのコメントとして記述されています。.(ピリオド)は、アセンブラファイル名をC/C++モジュール(skeleton)と同様の方法で設定し、拡張子のみをsに変更するように指定します。-On オプションは、最適化が使用されないことを意味し、-e は言語拡張を有効なことを意味します。さらに、関連のコンパイラオプションを必ず使用してください。通常ご自分のプロジェクトの他のC/C++ ソースファイルで使用するものと同じです。
その結果、アセンブラソース出力ファイルskeleton.sが生成されます。
注記
-lAオプションは、コールフレーム情報 (CFI)ディレクティブを含むリストファイルを作成します。これは、これらのディレクティブと使用方法について調べる意図がある場合に便利です。呼び出し規約のみを調べるのであれば、CFIディレクティブをリストファイルから除外できます。
注意
IDEでは、リストファイルからCFIディレクティブを除外するには、[プロジェクト]>[オプション]>[C/C++コンパイラ]>[リスト]を選択し、[コールフレーム情報を含める]サブオプションの選択を解除します。
危険
コマンドラインで、リストファイルからCFIディレクティブを除外するには、-lAオプションではなくオプション-lBを使用します。
注記
C-SPYの[コールスタック]ウィンドウを機能させるには、CFI情報をソースコードにインクルードする必要があります。
出力ファイル
出力ファイルには、以下の重要情報が含まれています。
呼び出し規約
リターン値
グローバル変数
関数パラメータ
スタック(自動変数)空間を作成する方法
コールフレーム情報(CFI)
CFIディレクティブは、デバッガの[コールスタック]ウィンドウで必要なコールフレーム情報を記述します。詳細については、呼出しフレーム情報を参照してください。