Cの関数呼び出しにカスタムX86_64の呼び出し規約
-
20-09-2019 - |
質問
私は他の呼び出し規約を持つC関数への彼の呼び出し規約を使用して、X86_64アセンブリコードからの呼び出しを許可するインターフェース(たとえば、ラッパー)を行うことをしました。最善のことはかなり「コンパイラに依存しない」(ラッパーを変更するジュスト)することになるので、私は戻って、コンパイラに登録/スタックのものを置く何かを探しています。私はすでにここを見てきました:カスタムP /呼び出しと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でこれを行うための適切な方法はありますか?
どうもありがとうございました。
解決
は、(スタックなどに何これ?レジスタに)規則を呼び出す方法と、パラメータが関数に渡されるのマニュアルについては、<のhref = "を見てみましょうhttp://www.agner.org/optimize/ calling_conventions.pdf」のrel = "nofollowをnoreferrer"> Agner霧のドキュメントでます。
次に、あなたは彼らがそれを行う方法を確認するには libffiするのソースコードを見てすることができます。