Используется ли регистр ecx для передачи одного из параметров в вызов статической функции?

Я знаю, что при вызове нестатической функции-члена объекта в c ++ указатель this передается в регистр ecx. Как насчет статических функций, так как этот указатель отсутствует, использует ли компилятор регистр ecx для передачи одного из обычных параметров в этом случае?

Edit — я говорю о соглашении о вызовах cdecl здесь.

4

Решение

Какие 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 используется для передачи одного из параметров в вызов статической функции.

6

Другие решения

Других решений пока нет …