4

C++ でオブジェクトの非静的メンバー関数を呼び出すと、this ポインターが ecx レジスターに渡されることがわかっています。this ポインターがないため、静的関数はどうなりますか? この場合、コンパイラーは ecx レジスターを使用して通常のパラメーターの 1 つを渡しますか?

編集 - ここでは cdecl 呼び出し規約について話しています。

4

1 に答える 1

6

関数を呼び出すときに何ecx(またはその他のレジスタ) が使用されるかは、呼び出し規約によって異なります。

たとえば、C++ コードを考えてみます。

struct S {
    static void f( int, int ) { }
    void g( int ) { }
};

void g() {
    S::f( 3, 4 );
    S s;
    s.g( 3 );
}

これを Microsoft Visual Studio 2010 (64bit) でコンパイルする

cl /c main.cpp

そして、アセンブリをダンプします

dumpbin /disasm main.obj

関数にこれを与えgます:

?g@@YAXXZ (void __cdecl g(void)):
  0000000000000000: 48 83 EC 38        sub         rsp,38h
  0000000000000004: BA 04 00 00 00     mov         edx,4
  0000000000000009: B9 03 00 00 00     mov         ecx,3
  000000000000000E: E8 00 00 00 00     call        ?f@S@@SAXHH@Z
  0000000000000013: BA 03 00 00 00     mov         edx,3
  0000000000000018: 48 8D 4C 24 20     lea         rcx,[rsp+20h]
  000000000000001D: E8 00 00 00 00     call        ?g@S@@QEAAXH@Z
  0000000000000022: 48 83 C4 38        add         rsp,38h
  0000000000000026: C3                 ret

静的S::fメソッドへの最初の呼び出しで、最初の引数 (3) が渡されecx、2 番目の引数 (4)が に渡されていることに注目してedxください。したがって、あなたの質問に対する答えは次のとおりです。

はい。この特定のコンパイラでecxは、静的関数呼び出しでパラメーターの 1 つを渡すために使用されます。

于 2012-09-19T07:53:43.950 に答える