自定义X86_64调用约定到C函数调用

时间:2010-01-15 10:33:47

标签: c assembly x86-64 calling-convention libffi

我要做一个接口(比如一个包装器),允许从X86_64汇编代码调用它的调用约定到C函数,以及其他调用约定。最好的事情是非常“编译器独立”(juste修改包装器),所以我正在寻找将寄存器/堆栈内容放在编译器上的东西。我已经看过这里了:Custom calling convention for P/Invoke and 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)?

非常感谢

1 个答案:

答案 0 :(得分:3)

有关调用约定的文档以及如何将参数传递给函数(在寄存器中?哪些?堆栈上的内容等)请查看Agner Fog's document

然后,您可以查看libffi的源代码,了解他们是如何做到的。