평소에 알고 있다고 생각했는데 막상 답변해 줄려니 좀 힘드네요.
그래서 인터넷을 좀 찾아 봤는데요.
다음과 같은 정의가 많이 나오네요.
인텔 x86 CPU에서 세그먼트를 지정하여 현재의 암시된 세그먼트 이외의 다른 세그먼트를 나타낼때 사용하는 포인터
라고 말이지요.
도스에서는 인텔 CPU가 RealMode에서 동작했습니다. RealMode에서는 메모리 접근시 두 가지 방법이 있는데, offset만을 지정하는 방법과, segment와 offset을 같이 지정해 주는 방식입니다. segment와 offset모두 16비트 값인데, 주소는 다음과 같이 계산됩니다.
주소=segment*16+offset
far를 사용하지 않을 경우에는 near 포인터로 볼 수 있는데, 이때에는 offset만 사용하므로 16비트 즉, 64KB이내의 메모리 주소를 계산할 수 있는반면, far에서는 segment에 의해서 추가적인 4비트까지 지정이 가능하므로 20비트, 즉 1MB까지의 메모리를 지정할 수 있습니다.
실행파일의 크기가 클 경우, 함수를 호출하는 부분과 실제 함수의 구현부가 코드내에서 주소상으로 64KB보다 더 많이 떨어져 있을 경우가 생길 수 있겠죠. 이 경우에는 Far Pointer를 사용해야 하는 것입니다. 컴파일러에 따라서 이런 far를 사용할지 near를 사용할지 자동으로 해주는 게 있는지는 잘 모르겠네요.
또, 질문자 님이 만약 Win32에서 윈도우 프로그래밍을 하고 계신 경우라면, 이 Win32는 인텔 CPU가 보호모드(32비트에서 동작하는 모드)에서 동작하므로, offset자체가 32비트이므로 far라는 개념이 없어지게 되기 때문에 far를 사용하실 필요가 없습니다.
<출처> 지식인
'Hello CE,Mobile' 카테고리의 다른 글
DCB Structure (0) | 2009.12.29 |
---|---|
CString 형변환 (1) | 2009.12.17 |
IsAPIReady() (0) | 2009.12.15 |
SOURCELIBS 와 TARGETLIBS (0) | 2009.12.14 |
SendMessage() 와 PostMessage() 차이 (0) | 2009.12.11 |