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