C++에서 객체의 비 정적 멤버 함수를 호출 할 때이 포인터가 ecx 레지스터로 전달된다는 것을 알고 있습니다. 정적 함수는이 포인터가 없기 때문에 컴파일러가 ecx 레지스터를 사용하여이 경우 일반 매개 변수 중 하나를 전달합니까?ecx 레지스터는 정적 함수 호출에서 매개 변수 중 하나를 전달하는 데 사용됩니까?
편집 - 저는 여기에 국제 대회의 cdecl에 대해 말하고 있습니다.
C++에서 객체의 비 정적 멤버 함수를 호출 할 때이 포인터가 ecx 레지스터로 전달된다는 것을 알고 있습니다. 정적 함수는이 포인터가 없기 때문에 컴파일러가 ecx 레지스터를 사용하여이 경우 일반 매개 변수 중 하나를 전달합니까?ecx 레지스터는 정적 함수 호출에서 매개 변수 중 하나를 전달하는 데 사용됩니까?
편집 - 저는 여기에 국제 대회의 cdecl에 대해 말하고 있습니다.
어떤 함수를 호출 할 때 ecx
(또는 다른 레지스터)은 calling convention에 의존합니다.
dumpbin /disasm main.obj
이 부여를 통해 다음
cl /c main.cpp
그리고 어셈블리를 덤핑을 통해 인스턴스를 사용하여 C를 고려 ++ 코드 마이크로 소프트 비주얼 스튜디오 2010 (64 비트)로이 컴파일
struct S {
static void f(int, int) { }
void g(int) { }
};
void g() {
S::f(3, 4);
S s;
s.g(3);
}
를 들어
g
함수의 경우 :
S::f
있어서의 최초의 호출은 제 argment을 얼마나
[email protected]@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 [email protected]@@[email protected]
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 [email protected]@@[email protected]
0000000000000022: 48 83 C4 38 add rsp,38h
0000000000000026: C3 ret
통지 (3) ecx
전달 및 제 argment (4) edx
인치 질문에 대한 답변은
예입니다. 이 특정 컴파일러의 경우 ecx
은 정적 함수 호출에서 매개 변수 중 하나를 전달하는 데 사용됩니다.
내 자신의 질문에 대답 - 분명히 32 비트 비주얼 스튜디오 컴파일러는 당신이 설명한 것과 동일합니다. 감사. – Raminder
[호출 규칙에 따라 다르게 보입니다.] (http://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions) 일부 규칙은 수행하지 않지만 일부 규칙은 수행하지 않습니다. – Mysticial
특정 개체에 대한 주소를 조회 할 필요가 없으므로 단순히 해당 주소로 전화를 겁니다. – Pyjong