Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C函数调用的自定义X86_64调用约定_C_Assembly_X86 64_Calling Convention_Libffi - Fatal编程技术网

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

C函数调用的自定义X86_64调用约定,c,assembly,x86-64,calling-convention,libffi,C,Assembly,X86 64,Calling Convention,Libffi,我必须做一个接口(比如包装器),它允许X86_64汇编代码使用其对C函数的调用约定和其他调用约定进行调用。最好的方法是相当“独立于编译器”(只需修改包装器),所以我正在寻找将寄存器/堆栈内容放回编译器的方法。我已经看过这里了:它离我要做的事情很近了。目前,我正在使用GCC,但欢迎来自其他编译器的提示 因此,为了更好地了解问题(自定义编码约定很奇怪),这里有一件事: 我需要能够调用“特殊”(包装器)C函数;这里的工作是在其他C函数之间分派调用。因此,此包装器需要找到%r11,保存所有寄存器,并准备

我必须做一个接口(比如包装器),它允许X86_64汇编代码使用其对C函数的调用约定和其他调用约定进行调用。最好的方法是相当“独立于编译器”(只需修改包装器),所以我正在寻找将寄存器/堆栈内容放回编译器的方法。我已经看过这里了:它离我要做的事情很近了。目前,我正在使用GCC,但欢迎来自其他编译器的提示

因此,为了更好地了解问题(自定义编码约定很奇怪),这里有一件事:

我需要能够调用“特殊”(包装器)C函数;这里的工作是在其他C函数之间分派调用。因此,此包装器需要找到%r11,保存所有寄存器,并准备堆栈以供进一步调用。在C中有没有合适的方法来实现这一点(使用一些内联asm)


非常感谢您提供有关调用约定的文档,以及如何将参数传递给函数(在寄存器中?哪个?堆栈上有什么等等),请看一看


那么,你可以看看它的源代码,看看它们是如何做的。

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