This articleneeds additional citations forverification.(February 2024) |
In asegmented architecturecomputer, afar pointeris apointerto memory in a specific context,[1]such as asegment selectormaking it possible to point to addresses outside of the default segment.
Comparison and arithmetic on far pointers is problematic: there can be several different segment-offset address pairs pointing to onephysical address.
In 16-bit x86
editFor example, in anIntel 8086,as well as in later processors running16-bitcode, a far pointer has two parts: a 16-bitsegment value,and a 16-bitoffsetvalue. A linear address is obtained by shifting the binary segment value four times to the left, and then adding the offset value. Hence the effective address is 21 bits[Note 1].There can be up to 4096 different segment-offset address pairs pointing to one physical address. To compare two far pointers, they must first be converted (normalized) to their linear representation.
OnCcompilerstargeting the 8086 processor family, far pointers were declared using a non-standardfar
qualifier; e.g.,charfar*p;
defined a far pointer to achar.The difficulty of normalizing far pointers could be avoided with the non-standardhuge
qualifier. On other compilers it was done using an equally non-standard__far
qualifier.[2]
Example of far pointer:
#include<stdio.h>
intmain(){
charfar*p=(charfar*)0x55550005;
charfar*q=(charfar*)0x53332225;
*p=80;
(*p)++;
printf("%d",*q);
return0;
}
- Output of the following program: 81; Because both addresses point to same location.
- Physical Address = (value of segment register) * 0x10 + (value of offset).
- Location pointed to by pointer
p
is: 0x5555 * 0x10 + 0x0005 = 0x55555 - Location pointed to by pointer
q
is: 0x5333 * 0x10 + 0x2225 = 0x55555 - So,
p
andq
both point to the same location 0x55555.
Notes
edit- ^Early x86 processors only had a 20-bit address bus so results above 1MiBwrapped aroundto zero, discarding the carry bit. PC's using the 80286 or newer, which had the necessary address lines, implemented theA20 gateto toggle this behavior forbackwards compatibilitywith older software.
References
edit- ^Miller, Ethan L.; Neville-Neil, George; Benetopoulos, Achilles; Mehra, Pankaj; Bittman, Daniel (December 2023)."Pointers in Far Memory".Communications of the ACM.66(12). New York City:Association for Computing Machinery.ISSN0001-0782.LCCN61065941.OCLC1514517.WikidataQ1120519.RetrievedFebruary 11,2024.
- ^"Introduction to Open Watcom C/C++".GitHub.2024.RetrievedFebruary 11,2024.