0

ここで、ASM ファイルを C に変換する方法について尋ねましたが、その回答からは、それを行う合理的な方法がないように見えました。罰金。そのため、回答の1つは、関数をそのまま使用して、それで完了することを示唆していました。いいですね。

しかし、どのように?

なんてこった、考えられることはすべて試しました!私は Microchip ブランドの MCU (PIC18F4480) と Microchip ブランドの IDE (MPLAB IDE) を使用しており、ASM ファイルは Microchip が作成したものです。これまでのところ、まったく運がありません。

ASM(アセンブリ)については何も知りません。私は C++ でコーディングしていますが、率直に言って、それは変わりません。すべてのコードを新しい言語で書き直すことなく、Microchip ASM ファイルの関数にアクセスする方法が必要です。

ご覧になりたい方は、ASM ファイルとアプリケーション ノートをご覧ください

4

3 に答える 3

6

PIDInt.asmを見ると、C /C++から関数を呼び出すのはかなり簡単なはずです。最初に、VARIABLEDEFINITIONSにリストされているすべてのextern変数を宣言します。

extern unsigned char error0, error1; /* etc */

次に、「Function:」コメントを持つすべてのものに対してextern関数を宣言し、引数をとらず、結果を返しません。

extern void Proportional(); // extern "C" for C++

それらの1つを呼び出すには、入力変数を入力し、関数を呼び出して、出力変数を読み取ります。

于 2009-09-04T08:19:05.707 に答える
5

どういうわけか、アセンブリコードからオブジェクト(.o)ファイルを作成してから、C++ファイルをそのオブジェクトファイルにリンクする必要があると思います。extern "C"これらの関数をC++から呼び出すように宣言する必要があります。

ここでの詳細についてはよくわかりませんが、特にPICなどのマイクロコントローラーの場合、C++とアセンブリの間の呼び出し規約に問題がある可能性があります。

マイクロコントローラーに完全なC++機能セット、つまりオブジェクト、仮想関数、オーバーロードなどを実際に使用していますかそれは...悪くはありませんが、ほとんどのPIC開発はまだプレーンC(そしてもちろんアセンブリ)であると思いました。

于 2009-09-04T08:17:50.827 に答える
2

通常の方法は、アセンブラと 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);

特定の環境に複数の呼び出し規約があるかどうかについては、具体的な知識はありません。だから、これがどれほど役に立ったかはわかりません。幸運を祈ります。

于 2009-09-04T08:31:27.897 に答える