を& 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のインラインアセンブラの書き方にガイドするためにいくつかのリンクについてinline-assemblytag wikiを参照してください。
asm文でコードを実行する唯一の理由は、副作用ではなく出力オペランドを生成することだけである場合は、volatile
のままにしておくと、出力が未使用の場合は完全に削除してください。