5

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を使用)?

どうもありがとう

4

1 に答える 1

3

呼び出し規則とパラメーターが関数にどのように渡されるか (レジスターで? スタック上にあるものなど) に関するドキュメントについては、Agner Fog のドキュメントを参照してください。

次に、libffiのソース コードを見て、その方法を確認できます。

于 2010-01-15T10:41:47.480 に答える