2016-09-20 9 views
0

みんな!私は問題があります。 GCCでクラスメンバ関数のアドレスをasmで取得するにはどうすればよいですか?GCCでクラスメンバ関数のアドレスをasmで取得するにはどうすればよいですか?

VS2012では、アドレスを取得するために以下のコードを実行できます。

asm {mov eax, offset TEST::foo} 

ただし、GCCでは?

__asm__ __volatile__(
        "movq offset %1, %%rdi" 
        "movq %%rdi, %0" 
        :"=r"(addr) 
        :"r"(&TEST::foo) 
); 

これは失敗した...

答えて

1

を& T構文AT offsetキーワードを使用していません。さらに、&TEST::fooを既にレジスタに入れるようにコンパイラに依頼しました。

__asm__ (
       "mov %1, %0" 
       :"=r"(addr) 
       :"r"(&TEST::foo) 
); 

またはそれ以上:

__asm__ (""    // no instructions 
      :"=r"(addr) 
      :"0"(&TEST::foo) // same register as operand 0 
); 

あるいはさらに良い:addr = &TEST::foo;このためhttps://gcc.gnu.org/wiki/DontUseInlineAsm、それは何が起こっているかを知ることからコンパイラを停止するため。

の場合は、インラインasmを使用しますが、できるだけコンパイラにできるだけ多くのことをさせてください。制約を使用して、入力を希望する場所と出力をどこで残したかを指定します。 inline-asm文の最初または最後の命令がmovの場合、通常は間違っていることを意味します。あなたはRDI上のクロバーを宣言していないので、コンパイラは以下となります。(あなたの元で


バグ吸うしませんGNU Cのインラインアセンブラの書き方にガイドするためにいくつかのリンクについてtag wikiを参照してください。

asm文でコードを実行する唯一の理由は、副作用ではなく出力オペランドを生成することだけである場合は、volatileのままにしておくと、出力が未使用の場合は完全に削除してください。

関連する問題