ecx寄存器是否用于在静态函数调用中传递一个参数? 我知道,当调用C++中对象的非静态成员函数时,这个指针在ECX登记器中传递。静态函数呢,因为没有这个指针,编译器是否使用ecx寄存器在这种情况下传递一个常规参数

ecx寄存器是否用于在静态函数调用中传递一个参数? 我知道,当调用C++中对象的非静态成员函数时,这个指针在ECX登记器中传递。静态函数呢,因为没有这个指针,编译器是否使用ecx寄存器在这种情况下传递一个常规参数,c++,assembly,x86,C++,Assembly,X86,编辑-我在这里谈论的是cdecl调用约定。当调用函数取决于 例如,考虑C++代码< /P> 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位)通过 然后通过 dumpbin /disasm main.obj 为g功能提供以下信

编辑-我在这里谈论的是cdecl调用约定。

当调用函数取决于

例如,考虑C++代码< /P>

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位)通过

然后通过

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
用于在静态函数调用中传递一个参数。

有些约定可以传递,有些不可以。我怀疑,因为不需要查找特定对象的地址,回答我自己的问题-显然32位visual studio编译器的功能与您描述的相同。谢谢
?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