C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[712] [답변] HORONG/ _fastcall에대해서 자세히 설명해 주세요~/프포
담비 [ ] 9787 읽음    1998-11-11 23:29


안녕하세요! 담비입니다.

질문하신 내용은 calling convention에 관련한 내용입니다.
일반적으로 호출 관례는 _cdecl, _pascal, _fastcall, _stdcall  등과 같은 것들이  있습니다.

_cdecl

일반적인 C호출 방식입니다.
Underbar를 변환시키고 대소문자를 구분하며, 파라미터를 오른쪽에서 왼쪽으로
Stak에 쌓아둡니다. 일반적인 함수나 Subroutine의 호출에 사용되는 방식입니다.
중요한것은 파라미터의 수가 반드시 고정적일 필요는 없다는 것입니다.

_pascal

일반적인 Pascal의 호출 방식입니다.
Underbar를 변환시키지 않으며 모두 대문자로 취급합니다. 그리고 함수를 호출한
쪽에서 사용한 Stack을 깨끗하게 청소할 책임을 집니다. 또한 파라미터는 왼쪽에서
오른쪽으로 Stack에 쌓아갑니다.

_stdcall

Underbar를 compile시 변환시키지 않으며, 대소문자를 구분하고, stack으로부터
pop하여 함수를 호출하고 파라미터를 오른쪽에서 부터 왼쪽으로 Stack에 저장합니다.
C 호출방식과 다른점은 반드시 함수가 정확한 인수의 type과 개수를 넘겨주어야
한다는 점입니다.

register

위의 keyword는 변수 선언시 가능하다면 register에 변수를 잡으라고 compiler에
지시하는 것입니다.
하지만 위의 keyword를 사용하지 않는다 하더라도 compiler는 임의의 변수 한개는
register를 사용하여 연산을 합니다. 프로그래머가 빠른 연산을 요구하는 변수를
사용하고자 할경우 강제로 keyword를 사용하여 정의할 수 있습니다. 이와 비슷한
내용이 _fastcall입니다.

_fastcall

가능하다면 파라미터를 register를 사용하여 연산할 수 있도록 compiler에게
지시합니다. 첫번째부터 세번째까지의 파라미터가 왼쪽에서부터 오른쪽으로
전달되며 EAX,EDX,ECX를 사용하게 됩니다. 하지만 FLOTING-TYPE이나,
STRUCTURE TYPE은 사용할 수 없습니다.
만일 파라미터의 타입이 char인 경우 al,dl,cl을 short인 경우 ax,dx,cx를
int 또는 long인 경우 eax,edx,ecx register를 사용하게 됩니다. 이와 같이
register를 사용한다는것은 어디까지나 가능하다면 그렇게 하라는 것입니다.
만일 함수 호출 당시 register를 사용할 수 없다면 일반적인 호출 방식과
다를 바가 없겠지요.



+ -

관련 글 리스트
706 [질문] _fastcall에대해서 자세히 설명해 주세요~/프포 horong 6756 1998/11/10
712     [답변] HORONG/ _fastcall에대해서 자세히 설명해 주세요~/프포 담비 9787 1998/11/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.