インラインアセンブリからC/C ++関数を呼び出したい場合は、次のようにすることができます。
void callee() {}
void caller()
{
asm("call *%0" : : "r"(callee));
}
GCCは、次のようなコードを出力します。
movl $callee, %eax
call *%eax
間接呼び出しは古いCPUのパイプラインを破壊するため、これは問題になる可能性があります。
のアドレスは最終的に定数であるため、制約callee
を使用できると想像できます。i
GCCオンラインドキュメントからの引用:
「私」
即値の整数オペランド(定数値を持つもの)が許可されます。これには、アセンブリ時以降にのみ値がわかるシンボリック定数が含まれます。
私がこのようにそれを使おうとすると:
asm("call %0" : : "i"(callee));
アセンブラから次のエラーが発生します。
エラー:`call'のサフィックスまたはオペランドが無効です
これは、GCCがコードを発行するためです
call $callee
それ以外の
call callee
だから私の質問は、GCC出力を正しくすることが可能かどうかですcall
。