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