ecx寄存器用于传递静态函数调用中的一个参数吗?

Ram*_*der 4 c++ x86 assembly

我知道当在c ++中调用对象的非静态成员函数时,this指针在ecx寄存器中传递.那么静态函数,因为没有这个指针,编译器是否使用ecx寄存器来传递这种情况下的常规参数之一?

编辑 - 我在这里谈论cdecl调用约定.

Fre*_*abe 6

ecx调用函数时使用的是什么(或任何其他寄存器)取决于调用约定.

例如,考虑C++代码

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

void g() {
    S::f( 3, 4 );
    S s;
    s.g( 3 );
}
Run Code Online (Sandbox Code Playgroud)

通过Microsoft Visual Studio 2010(64位)进行编译

cl /c main.cpp
Run Code Online (Sandbox Code Playgroud)

然后通过倾倒装配

dumpbin /disasm main.obj
Run Code Online (Sandbox Code Playgroud)

给出了这个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
Run Code Online (Sandbox Code Playgroud)

注意对静态S::f方法的第一次调用如何传入第一个段(3)ecx和第二个段(4)edx.所以你的问题的答案是:

是.对于此特定编译器,ecx用于在静态函数调用中传递其中一个参数.