원점

Far pointer

세그먼트 아키텍처 컴퓨터에서 원점 포인터는 세그먼트 셀렉터를 포함한 포인터이며, 디폴트 세그먼트 이외의 주소를 가리킬 수 있다.

원점에서의 비교와 산술은 문제가 있습니다.하나의 물리 주소를 가리키는 복수의 다른 세그먼트오프셋주소 페어가 존재할 수 있습니다.

16비트 x86

예를 들어 Intel 8086 16비트 코드를 실행하는 최신 프로세서에서 원점 포인터는 16비트 세그먼트 값과 16비트 오프셋 값의 두 부분으로 구성됩니다.선형 주소는 이진 세그먼트 값을 왼쪽으로 네 번 이동한 다음 오프셋 값을 더하면 얻을 수 있습니다.따라서 유효 주소는 20비트(실제로 21비트), 주소 랩어라운드와 게이트 A20으로 이어집니다.최대 4096개의 다른 세그먼트오프셋주소 쌍이1개의 물리 주소를 포인트 할 수 있습니다.2개의 원점 포인터를 비교하려면 먼저 20비트 선형 표현으로 변환(정규화)해야 합니다.

8086 프로세서 패밀리를 대상으로 한 Ccompiler에서는 비표준 원점 수식자를 사용하여 원점 포인터가 선언되었습니다.예를들면,char far *p;문자 포인터를 정의했습니다.비표준 거대 한정자를 사용하면 원점 포인터를 정규화하는 어려움을 피할 수 있습니다.

원점 포인터의 예:

#실패하다 <stdio.h> 인트 주된() {     멀리. *p =( 멀리. *)0x55550005;     멀리. *q =( 멀리. *)0x53332225;    *p = 80;    (*p)++;    인쇄물(%d,*q);    돌아가다 0; } 
다음 프로그램의 출력: 81; 두 주소가 같은 위치를 가리키기 때문입니다.
물리적 주소 = (세그먼트 레지스터 값) * 0x10 + (오프셋 값)
포인터 'p'가 가리키는 위치는 0x5555 * 0x10 + 0x0005 = 0x5555입니다.
포인터 'q'가 가리키는 위치는 0x53333 * 0x10 + 0x2225 = 0x5555입니다.
따라서 p와 q는 모두 같은 위치 0x55555를 가리키고 있습니다.

레퍼런스