2009-09-03 5 views
3

여기에 C 호출 스택 전환에 관한 내 previous question이 있습니다. 그러나 C++은 다른 호출 규칙 (thiscall)을 사용하며 일부 다른 asm 코드가 필요할 수 있습니다. 누군가가 차이점을 설명하고 C++ 콜 스택 (GCC 인라인 asm)을 전환하는 코드 스 니펫을 가리키거나 제공 할 수 있습니까?C++ 함수에 대한 호출 스택 전환

덕분에, 제임스

+1

setjmp/longjmp를 사용하는 대신 자신의 롤링을위한 이유가 있습니까? – moonshadow

답변

2

앞의 질문에 주어진 코드는 잘 작동합니다.

thiscall calling convention은 스택에서 인수를 팝하는 책임이있는 사람 만 다릅니다. thiscall 호출 규칙에 따라 호출 수신자가 인수를 팝합니다 (또한 ecx에 포인터가 전달됨). C 호출 규칙에 따라 호출자가 인수를 팝합니다. 컨텍스트 스위치에는 영향을주지 않습니다.

그러나 컨텍스트 전환을 직접 수행하려는 경우 스택을 전환 할뿐만 아니라 레지스터 (스택에있을 수도 있음)를 저장하고 복원해야합니다.

참고로, C++이 thiscall을 항상 사용하는 것은 아니며 고정 된 수의 인수가있는 메서드에만 사용됩니다 (Microsoft .NET에서 사용하는 것 ... g ++에서는 사용하지 않습니다) .

+0

음, 숨겨진'this' 매개 변수가 피 호출자에게 전달되는 부분에 대해서만 thiscall이 아닌가요? (일부 등록에서는 IIRC이지만, 나는 이것으로 내 깊이 빠져 나간다. 그래서 내가 여기에 집중하지 않으면 나를 무시한다 ...) – sbi

+0

thiscall을 fastcall과 혼동하지 않을 것이라고 확신 하는가? thiscall은 ecx를 통해 오인되지 않으면 fastcall이 컴파일러에 의해 스택에 푸시하는 대신 레지스터를 통해 전달 될 때이 포인터를 전달합니다. – Dmitry

+0

네, 맞아요. 세부 사항이 포함 된 MSDN 항목에 대한 링크를 추가했습니다. –

1

C++ 용 ABI는 명시 적으로 정의되어 있지 않습니다.

컴파일러 제조업체는 최적의 호출 규칙을 사용하여 C++을 더 빠르게 만들 수 있다는 아이디어가있었습니다.

이것은 컴파일러마다 고유 한 호출 규칙이 있으므로 다른 컴파일러의 코드가 호환되지 않는다는 것입니다. 동일한 컴파일러의 다른 버전 (또는 다른 최적화 플래그)도 호환되지 않을 수 있습니다.

관련 문제