Я знаю, что при вызове нестатической функции-члена объекта в c ++ указатель this передается в регистр ecx. Как насчет статических функций, так как этот указатель отсутствует, использует ли компилятор регистр ecx для передачи одного из обычных параметров в этом случае?
Edit — я говорю о соглашении о вызовах 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
и второй фрагмент (4) в edx
, Итак, ответ на ваш вопрос:
Да. Для этого конкретного компилятора ecx
используется для передачи одного из параметров в вызов статической функции.
Других решений пока нет …