2012-08-06 2 views
3

MSVS는 내 기능에서 __stdcall 지시어를 무시합니다. 나는 스택을 수동으로 정리하고 있지만 컴파일러는 각 CALL 다음에 여전히 ADD ESP 명령어를 추가합니다.컴파일러가 __stdcall을 무시합니다

이 나는 ​​함수 선언하는 방법입니다

extern "C" void * __stdcall core_call(int addr, ...); 
#define function(...) (DWORD WINAPI) core_call(12345, __VA_ARGS__) 
return function("Hello", 789); 

을 그리고 이것은 같은 출력이 모습입니다 : 내가 화살표로 표시 한 http://vs712.server4u.cz/msvs.png

MSVS 자동으로 각 후 추가 중복 ADD 지침을, 사실에도 불구하고 스택을 지우는 것이 호출 수신자 책임 (참조 : http://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions)이며 이로 인해 내 progrm이 중단됩니다. 수동으로 ADD 지침을 NOPs으로 바꾼다면 프로그램은 가정 된대로 작동합니다. 그래서, 내 질문은 ... 거기에 지침을 addaing 컴파일러 강제로 방법이 있나요?

감사합니다.

답변

5

여기에 문제가 있습니다 : , ...).

가변 개수의 인수가있는 함수는 __stdcall이 될 수 없습니다.

__stdcall 함수는 스택의 모든 스택 인수를 끝에 스택에서 제거해야하지만, 매개 변수로받는 물건의 양을 미리 알 수 없습니다.

__fastcall 기능에도 동일하게 적용됩니다.

가변 인수 인수가있는 경우에만 적용 가능한 호출 규칙은 __cdecl이며 호출자는 호출 후에 스택 매개 변수를 제거해야합니다. 그리고 그것은 컴파일러가 __stdcall을 사용하라는 요청에도 불구하고 사용합니다.

+0

컴파일러가 명시 적으로 요청 된 호출 규칙을 무시할 때 경고가 생성되는지 알고 있습니까? –

+0

답장을 보내 주셔서 감사합니다. 문제가있는 곳을 발견하는 동안 코드를 디버깅하는 데 몇 시간을 보냈습니다. 컴파일러는 약간의 경고를 보여 주었지만, 내가 명시 적으로 지정한 것을 무시하는 이유는 분명하지 않았습니다. 그러나이를 해결하는 방법이 있습니까? 필자는 심지어 core_call 함수에 인수를 전달하기 위해 일부 인라인 어셈블리를 작성하려고했지만 성공하지 못했습니다. – Peter

+0

[this] (http://pastebin.com/Fntqb1j2)와 같은 것을 시도하고 함수 포인터를 사용하십시오. –

관련 문제