我知道在c ++中调用对象的非静态成员函数时,this指针在ecx寄存器中传递。那么静态函数怎么样,因为没有这个指针,编译器在这种情况下是否使用ecx寄存器传递一个常规参数?
编辑 - 我在这里谈论cdecl调用约定。
答案 0 :(得分:6)
调用函数时使用的ecx
(或任何其他寄存器)取决于calling convention。
例如,考虑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(64位)通过
进行编译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
方法的第一次调用如何在ecx
中传递第一个段(3),在edx
中传递第二个段(4)。所以你的问题的答案是:
是。对于此特定编译器,ecx
用于传递静态函数调用中的一个参数。