我必须做一个接口(比如,一个包装器),它允许使用他的调用约定从 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)?
非常感谢