3

そのため、Windows で fastcall 呼び出し規約を使用して関数を呼び出す必要があるアセンブリがありますが、gcc はそれをサポートしていません。GCC は regparm 属性を提供しますが、最初の 3 つのパラメーターが eax、edx、および ecx で渡されることを想定していますが、fastcall は最初の 2 つのパラメーターが ecx および edx で渡されることを想定しています。

いくつかのコード パスの重複を効果的に回避しようとしているだけなので、これは厳密には重要ではありませんが、回避できれば素晴らしいことです。

4

3 に答える 3

11

GCC は をfastcall介し​​て をサポートしてい__attribute__((fastcall))ます。GCC 3.4 で導入されたようです。

于 2008-10-03T03:01:09.440 に答える
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は標準化されていないため、プラットフォームごとに実装が異なります。他にもいくつかありますが、頭のてっぺんから引き抜くことができるのはそれだけです。

于 2012-04-20T21:05:53.340 に答える
1

関数を asm から呼び出す場合は、関数の呼び出し方法を完全に制御できます。レジスタをロードして発行するのを妨げているのはCALL何ですか?

于 2008-10-03T03:00:53.903 に答える