所以我有一个程序集需要在windows上使用fastcall调用约定来调用函数,但是gcc没有(afaict)支持它。 GCC确实提供了regparm属性,但是期望前三个参数在eax,edx和ecx中传递,而fastcall期望前两个参数在ecx和edx中传递。
我只是试图避免有效地复制一些代码路径,所以这并不是非常重要,但如果它是可以避免的话会很棒。
答案 0 :(得分:11)
GCC通过fastcall
支持__attribute__((fastcall))
。它似乎已在GCC 3.4中引入。
答案 1 :(得分:4)
我知道我在派对上迟到了,但是如果你们中的任何一个偶然发现,请记住你可以定义一个宏来模仿它。例如:
#if defined(__GNUC__)
#define MSFASTCALL __fastcall
#define GCCFASTCALL
#elif defined(_MSC_VER)
#define MSFASTCALL
#define GCCFASTCALL __attribute__((fastcall))
#endif
int MSFASTCALL magic() GCCFASTCALL;
显然,这看起来很丑陋,所以你可以定义2个原型(这就是我所做的),使它更容易阅读,但有些人更喜欢需要较少打字的路线。除了特殊情况,我通常不使用调用约定。我只是让编译器优化休息。
现在,有一些要记住的怪癖。例如,当您的目标是64位平台时,所有函数都使用fastcall约定,以便利用额外的寄存器并提高速度并降低间接成本。同样,fastcall由不同的平台实现,因为它不是标准化的。还有其他一些,但这就是我所能解决的问题。
答案 2 :(得分:1)
如果您从asm调用该函数,那么您肯定可以完全控制调用该函数的方式。是什么阻止你加载寄存器并发出CALL
?