4

私はこのQをTIの28xxDSPフォーラムに投稿しましたが、応答がなく、おそらくここの誰かが知っているかもしれないと考えました。


C呼び出し可能になるようにアセンブリで関数を書く方法を知っています。C呼び出し可能名前がのfoo()場合、アセンブリ関数の名前は_foo()です。

C ++を使用して、アセンブリでクラスメソッドを最適化する場合はどうなりますか?それ、どうやったら出来るの?私は唯一の主要な問題は次のとおりだと思います。

  • ネーミング
  • 「this」ポインタへのアクセス
  • どういうわけかオフセットを知ることによってクラスメンバーにアクセスする

最後の2つについて心配したくない場合は、静的メンバー関数を記述して次のようにします。

class MyClass
{
  int x;
  static int _doSomething(int u); // implement this in assembly
public:
  inline void doSomething() { x = _doSomething(x); } 
  // lightweight C++ wrapper to handle the class member / "this" pointer stuff
};
4

3 に答える 3

5

ポインタは、thisプラットフォームの標準の呼び出し規約を使用して、関数への追加の引数として渡されます。私が精通しているすべてのプラットフォームで、最初の引数として渡されますが、C ++コーディングはあまり行わないため、これが標準で保証されているかどうかはわかりません。確認のために、プラットフォーム上でいつでもC++コードを分解できます。

C ++シンボルの命名は、Cよりもかなり面倒であり、コンパイラーごとに異なります。コンパイルされた関数定義を逆アセンブルすることで、使用する適切なシンボル名を理解できると思います。関数が適切なクラスのメンバーであり、適切な数とタイプの引数を持っていることを確認してください。

本当にC++関数をその場で再現する必要がない限り、私はおそらく標準のC関数を作成し、extern "C" { ... }その宣言の周りで通常のことをします。

于 2010-01-11T14:45:39.670 に答える
1

コンパイラにはインラインアセンブリ構文がありますか?それがある場合は、それが最も簡単なオプションである可能性があり、コンパイラーに関数の名前付けを処理させ、構文部分を呼び出すことができます。

あるいは、「単純な」C関数呼び出しのインラインラッパーとしてC++メソッドを記述するというStephenの提案は良いものです。(単純なCインターフェースを取得するために、投稿のような静的メンバー関数ではなく、単なる関数にしたい場合があります。)

于 2010-01-11T18:47:22.507 に答える
0

コンパイラに依存するフラグを見つけて、C++関数内にアセンブリを記述します。通常、アセンブリセクション内からローカル変数を参照する方法があります。

于 2010-01-11T20:32:41.247 に答える