C函数调用的自定义X86_64调用约定
我必须做一个接口(比如包装器),它允许X86_64汇编代码使用其对C函数的调用约定和其他调用约定进行调用。最好的方法是相当“独立于编译器”(只需修改包装器),所以我正在寻找将寄存器/堆栈内容放回编译器的方法。我已经看过这里了:它离我要做的事情很近了。目前,我正在使用GCC,但欢迎来自其他编译器的提示 因此,为了更好地了解问题(自定义编码约定很奇怪),这里有一件事: 我需要能够调用“特殊”(包装器)C函数;这里的工作是在其他C函数之间分派调用。因此,此包装器需要找到%r11,保存所有寄存器,并准备堆栈以供进一步调用。在C中有没有合适的方法来实现这一点(使用一些内联asm)C函数调用的自定义X86_64调用约定,c,assembly,x86-64,calling-convention,libffi,C,Assembly,X86 64,Calling Convention,Libffi,我必须做一个接口(比如包装器),它允许X86_64汇编代码使用其对C函数的调用约定和其他调用约定进行调用。最好的方法是相当“独立于编译器”(只需修改包装器),所以我正在寻找将寄存器/堆栈内容放回编译器的方法。我已经看过这里了:它离我要做的事情很近了。目前,我正在使用GCC,但欢迎来自其他编译器的提示 因此,为了更好地了解问题(自定义编码约定很奇怪),这里有一件事: 我需要能够调用“特殊”(包装器)C函数;这里的工作是在其他C函数之间分派调用。因此,此包装器需要找到%r11,保存所有寄存器,并准备
非常感谢您提供有关调用约定的文档,以及如何将参数传递给函数(在寄存器中?哪个?堆栈上有什么等等),请看一看
那么,你可以看看它的源代码,看看它们是如何做的。
VisualC++有一个代码< > SysExpCube(裸)< /C>修饰符,它可以防止编译器产生序言和尾声。我不认识Liffi,我要检查一下,听起来很棒。如果我是你,如果可能的话,我会依赖Liffi。它是稳定的,维护和处理许多角落的案件。所以,阿格纳·福格的文件非常有用。但libffi并没有保存所有寄存器,特别是YMM寄存器(还没有?)。顺便说一句,我应该可以用它做一些事情!谢谢。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