通常の方法は、アセンブラと C/C++ コンパイラを備えたビルド環境とツールを使用することです。コンパイラ (およびアセンブラ) は、ソース ファイルを受け取り、中間オブジェクト ファイル形式を生成します。Microsoft ツールを使用する Microsoft Windows では、これらは .obj ファイルになります。
次に、リンカーを使用して、さまざまな言語 (fortran、cobol、c++、c、objective-c、アセンブリなど) によって生成される可能性がある .obj ファイルを単一のアプリケーション バイナリにリンクします。
オブジェクト ファイルは基本的に、エクスポートされたシンボルのコレクションであり、バイトの小さなチャンクにラベルを付け、未解決のシンボルにラベルを付け、別のオブジェクト ファイル内の何かを指すようにリンク中にパッチを適用する必要があるバイトのチャンクにラベルを付けます。
さて、よくある問題 - 私が経験したプラットフォームでは、あなたのプラットフォームに近いものではありませんが、C++ コンパイラは、言語間のバイナリ互換性を念頭に置いて作成されていません。一方、Cコンパイラは. そのため、C++ コンパイラは、パラメーターと戻り値の型に関するあらゆる種類の情報をシンボル名に組み込む、高度にマングルされたシンボルを作成します。このメカニズムにより、オペレーターのオーバーロードが可能になります。
とにかく肝心なのは、
- asm ファイルをビルドする必要があります。アセンブラがない場合は、運が悪いです。また、おそらく、c/c++ ツールセットと同じベンダーから入手する必要があります
- 外部シンボルの名前を C++ プログラムに伝える必要があります。AC互換の方法で。これは、ヘッダー ファイルが通常使用されるものです。
したがって、pid コードの関数宣言を保持するヘッダー ファイルを作成し、その中に次のようなものを配置します。
extern "C" void PidMain(void);
次に、そのヘッダー ファイルを C++ プログラムに #include し、アセンブラーによって生成されたオブジェクト ファイルが環境リンク ステップに含まれていることを確認します。
ある種の呼び出し規約が関係している可能性があります。一部の環境では、スタックにプッシュされる順序や、スタックのクリーンアップの責任者について、さまざまな基準があります。ほとんどの ms Windows ツールセットは、少なくとも __pascal および __cdecl 呼び出し規約をサポートしているため、宣言は次のようになります。
extern "C" void __pascal PidMain(void);
特定の環境に複数の呼び出し規約があるかどうかについては、具体的な知識はありません。だから、これがどれほど役に立ったかはわかりません。幸運を祈ります。