C言語とアセンブラモジュールの結合
呼出し規約のチェック
プロジェクトへのアセンブラモジュールの追加
プロジェクトの設定
一部のプロジェクトでは、ソースコードの一部をアセンブラ言語で記述する必要があります。このチュートリアルでは、まず、コンパイラを使用して呼出し規約をチェックする方法について説明します。呼出し規約は、C/C++モジュールからアセンブラモジュールを呼び出したり、その逆を行う場合に使用するので、その使用方法に慣れておく必要があります。次に、C言語で記述されたソースモジュールとアセンブラモジュールを結合する方法について、このチュートリアルで説明します。この結合は簡単に実行できるだけでなく、C++で記述されたソースモジュールを含むプロジェクトにも適用できます。
このチュートリアルでは、これまでに説明されているIAR Embedded Workbench® IDEの基本事項について習熟していることを前提としています。
呼出し規約のチェック
Cルーチンから呼び出されるアセンブラルーチンを記述する場合、コンパイラが使用する呼出し規約に注意する必要があります。C言語でスケルトンコードを作成し、そこからコンパイラでアセンブラ出力ファイルを生成することによって、生成されたアセンブラ出力ファイルを検証し、呼出し規約の詳細を知ることができます。
この例では、ファイルUtilities.cを使用して、コンパイラでアセンブラ出力ファイルを生成します。
1
前のチュートリアルプロジェクトで使用したものと同じワークスペースtutorialsに新しいプロジェクトを作成して、project2と名前を付けます。
2
Tutor.cUtilities.cの2つのファイルをプロジェクトに追加します。
ワークスペースの概要を表示するには、[ワークスペース]ウィンドウの下端にある概要タブをクリックします。新しく作成したプロジェクトだけを表示するには、[project2]タブをクリックします。ここでは[project2]ビューを表示します。
3
オプションを設定するには、プロジェクト>オプションを選択し、般オプションカテゴリを選択します。[OK]をクリックします。
4
プロジェクト>オプションを選択します。選択できるカテゴリは、C/C++ コンパイラカテゴリとカスタムビルドカテゴリだけであることに注意してください。
5
C/C++ コンパイラカテゴリで、オーバライド設定の継承 を選択して、以下の設定を確認します。
注: この例では、ローカル変数とグローバル変数のアクセスを示すため、コードのコンパイル時に最適化レベルを低くします。それより高い最適化レベルを使用すると、必要なローカル変数への参照が削除される可能性があります。ただし、最適化レベルによって実際の関数宣言が変更されることはありません。
6
[OK]をクリックして、[ワークスペース]ウィンドウに戻ります。
7
ファイルUtilities.cをコンパイルします。サブディレクトリprojects\debug\listに、出力ファイルUtilities.sが作成されます。
注: 限定版の製品インストールの場合、アセンブラファイルを生成できません。この場合、tutorディレクトリにある生成済みのファイルを調べます。
8
呼出し規約を調べて、アセンブラ言語でC/C++コードがどのように記述されるかを見るには、ファイルUtilities.sを開きます。
このファイルを見ることで、パラメータをどこでどのように受け渡すか、関数が呼び出されたプログラム位置にどのようにして戻るか、結果値をどのように戻すかを知ることができます。また、アセンブラレベルのルーチンではどのレジスタを保護する必要があるかがわかります。
注: 生成されたアセンブラソースファイルには、CFIディレクティブなどのコンバイラ内部情報が含まれている可能性があります。これらのディレクティブはデバッグのために存在するため、これらの詳細は無視する必要があります。
アプリケーション関数の適切なインタフェースを入手するには、インタフェースを必要とする関数ごとにスケルトンコードを作成する必要があります。
コンパイラが使用する呼出し規約の詳細については、『ARM®用IAR C/C++開発ガイド』を参照してください。
プロジェクトへのアセンブラモジュールの追加
このチュートリアルでは、アセンブラモジュールとCモジュールを両方とも含むプロジェクトを簡単に作成できる手順を示します。また、プロジェクトをコンパイルし、アセンブラ出力リストファイルを表示します。
__write関数を含むアセンブラモジュールを追加します。この関数は基本的な出力関数であり、すべてのキャラクタ出力を処理するputcharで使用されます。__writeの標準実装では、キャラクタ出力をC-SPY®の[ターミナルI/O]ウィンドウにリダイレクトします。ご使用バージョンの__writeでもリダイレクトします。各キャラクタの前に*と書かれた符号を出力する機能が追加されています。
プロジェクトの設定
1
Write.sファイルを追加することにより、project2を変更します。
注: ファイルの追加ダイアログボックスでアセンブラファイルを参照するには、プロジェクト>ファイルの追加を選択して、ファイルの種ドロップダウンリストからアセンブラファイルを選びます。
2
[ワークスペース]ウィンドウでプロジェクトレベルノードを選択して、ロジェクト>オプションを選択します。一般オプションC/C++ コンパイラリンカの各カテゴリではデフォルト設定を使用します。アセンブラカテゴリでリストタブをクリックして、リストファイルの出オプションを選択します。
[OK]をクリックします。
3
[ワークスペース]ウィンドウでファイルWrite.sを選択してプロジェク>コンパイラを選択し、アセンブルします。
ソースファイルが正常にアセンブルされ、リンク可能オブジェクトコードを含むファイルWrite.oが作成されます。
アセンブラリストファイルの表示
4
[ワークスペース]ウィンドウで、OutputフォルダにあるファイルWrite.lstを開きます。
ファイルのフッタには、生成されたエラーとワーニングの要約が記述されています。
リストファイル形式の詳細については、『ARM® IARアセンブラリファレンスガイド』を参照してください。
5
プロジェクト>作成を選択して、project2を再リンクします。
6
C-SPYを起動して、project2.outアプリケーションを実行します。前のチュートリアルと同じように動作していますが、各キャラクタの前に*が書かれていることを確認します。
操作が終わったら、デバッガを終了します。