我要做一个接口(比如一个包装器),允许从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)?
非常感谢
答案 0 :(得分:3)
有关调用约定的文档以及如何将参数传递给函数(在寄存器中?哪些?堆栈上的内容等)请查看Agner Fog's document。
然后,您可以查看libffi的源代码,了解他们是如何做到的。