X86_64アセンブリコードからC関数への呼び出し規約を使用して、他の呼び出し規約で呼び出しを許可するインターフェイス(ラッパーなど)を作成する必要があります。最善の方法は、かなり「コンパイラに依存しない」ことです(ラッパーを変更するだけです)ので、レジスタ/スタックをコンパイラに戻すものを探しています。私はすでにここを見てきました: P/Invoke と C#のカスタム呼び出し規約。現在、私は GCC を使用していますが、他のコンパイラからのヒントは大歓迎です!
したがって、問題を最もよく理解するために、次のことを示します(カスタムコーディング規則は奇妙です):
pushq %r11 # saves r11 for call
movq 64bits_address %r11 # move a 64 bits address that points on a data structure
callq *8(%r11) # calls an address in the data structure
popq %r11 # restores %r11 ; return value is in the structure
「特別な」(ラッパー) C 関数を呼び出せるようにする必要があります。ここでの仕事は、他の C 関数間の呼び出しをディスパッチすることです。そのため、このラッパーは %r11 を見つけ、すべてのレジスタを保存し、さらに呼び出すためにスタックを準備する必要があります。Cでこれを行う適切な方法はありますか(インラインasmを使用)?
どうもありがとう