원점
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를 가리키고 있습니다.