|
_Cdecl _FARFUNC 에 대해서...
프로그램이란 것은 Code, Data, Stack 이 3가지로 이루어져 있습니다.
메인프로그램에서 함수 또는 프로시져를 호출하는 경우 다음과 같이 이루어 집니다.
1. 함수호출 직전에 함수호출 이후의 CS:IP 를 Stack 에 저장하여 나중에 다음명령을 수행할 수 있도록 준비한다.
2. 호출함수의 인자를 Stack 에 Push 한다.
2. 해당 함수 루틴으로 이동하여 해당 루틴을 수행한다.
3. 함수가 종료되는 시점에서 Stack 에 저장되어 있던 인자를 제거한다.
4. 메인프로그램에서 CS:IP 를 복원하여 메인 프로그램을 계속 수행한다.
_____________________________________________________________
_Cdecl
_____________________________________________________________
2 번 과정 에서 Stack 에 함수의 인자를 Push 하는 방법과 3번 인자 제거 방법에 따라 다양한 Calling Convention 이 존재하며 각각 나름대로의 장점과 단점이 있습니다. 대표적인 것들을 살펴본다면
C 호출방식 : 인자를 Right->Left 순서로 Push, Stack Offset 을 메인프로그램에서 조정하여 Stack 을 조정함
해당 함수의 호출이 많을 경우 [호출수 * Stack 조정코드] 로 늘어나게 되며 수행시간이 느려진다.
PASCAL 호출방식 : 인자를 Left->Right 순서로 Push, 함수쪽에서 Stack 을 Pop 하여 Stack 을 조정함
제일 먼저 Push 된 것이 첫번째 인자임이 빨리 알 수 있으므로 인자 Access 속도가 빠르다.
보통 win32 API 의 경우 속도를 우선시 하기 때문에 PASCAL 호출방식을 따르게 설계가 됐다는 군요.
하지만 가변인자의 경우 어쩔수 없이 PASCAL 방식에서는 지원을 못하기 때문에 다른 방식을 사용해야 합니다.
_Cdecl 라는 것은 C Calling Convention 을 따른다는 의미입니다.
_____________________________________________________________
_FARFUNC
_____________________________________________________________
DOS 프로그램의 잔재인데 Far Call 이라는 것입니다.
함수호출에는 2가지가 존재하는데 Far Call 과 Near Call 이 존재합니다.
도스 프로그램의 경우 주소라는 것은 segment:Offset 으로 나타나게 됩니다.
이경우 CS 에 세그먼트주소가 들어가게 되고 IP 는 CS 를 Base 로 한 Offset 이 저장됩니다.
위 1번 과정에서 CS 및 IP 를 Stack 에 저장하는 경우를 Far Call 이라고 하면 IP 만 저장하는 경우를 Near Call 이라 합니다. 세그먼트란 64K size 의 Area 를 말합니다.
Far Call 이라는 것은 해당 함수를 호출하는 경우 해당 함수의 코드 위치가 현재 위치에서 64K 를 벗어난 위치에 존재하기 때문에 CS 주소도 스택에 저장해야 한다는 의미입니다.
이것은 도스 프로그램에서는 중요한 의미가 있으나 윈도우 프로그램의 경우 Flat Memory 라서 그냥 붙여 주는 것으로 알고 있습니다.
김상면 님이 쓰신 글 :
: #ifndef _이름_h
: 매크로 상수 _이름_h 가 정의 되어 있지않으면 다음 라인들을 시행하라
: #define _미름_h
: 매크로 상수 _이름_h 를 다른 곳에서 사용못하도록 하라
: #define _이름_h 123455 라고 하면 _이름_h을 123455로 정의 하라==>소스코드에서 _이름_h 는 123455와
: 완전히 똑 같은 표현이 됨
: #endif _이름_h
: 요건 모르겠음 아마 위의 #ifndef의 마지막를 가르키는 것 같음 베이직의 if문의 endif와 같은 역활을 하는거로
: 알고 있음
: _Cdecl _FARFUNC
: 요건 진짜 모름 dll생성시 이런 예약어 본것 같음
: 이만
:
: ==================================================================================================
: 얼마전에야 C++을 배우기 시작한 초보입니다.
:
: header file에 보면
:
: #ifndef _이름_h
: #define _미름_h
:
: 내용
:
: #endif _이름_h
:
: 뭐 이렇게 있는데, 어떤 역할을 하는지 궁금합니다.
:
: 그리고 변수 형태와 함수이름 사이에 있는
: _Cdecl _FARFUNC
: 이런 것들은 무엇을 의미하는지 가르쳐 주시면 감사하겠습니다.
:
: 즐거운 하루 되세요.
|