2012-09-19 2 views
3

C++에서 객체의 비 정적 멤버 함수를 호출 할 때이 포인터가 ecx 레지스터로 전달된다는 것을 알고 있습니다. 정적 함수는이 포인터가 없기 때문에 컴파일러가 ecx 레지스터를 사용하여이 경우 일반 매개 변수 중 하나를 전달합니까?ecx 레지스터는 정적 함수 호출에서 매개 변수 중 하나를 전달하는 데 사용됩니까?

편집 - 저는 여기에 국제 대회의 cdecl에 대해 말하고 있습니다.

+3

[호출 규칙에 따라 다르게 보입니다.] (http://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions) 일부 규칙은 수행하지 않지만 일부 규칙은 수행하지 않습니다. – Mysticial

+0

특정 개체에 대한 주소를 조회 할 필요가 없으므로 단순히 해당 주소로 전화를 겁니다. – Pyjong

답변

6

어떤 함수를 호출 할 때 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은 정적 함수 호출에서 매개 변수 중 하나를 전달하는 데 사용됩니다.

+0

내 자신의 질문에 대답 - 분명히 32 비트 비주얼 스튜디오 컴파일러는 당신이 설명한 것과 동일합니다. 감사. – Raminder

관련 문제