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

edit

For 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-standardfarqualifier; e.g.,charfar*p;defined a far pointer to achar.The difficulty of normalizing far pointers could be avoided with the non-standardhugequalifier. On other compilers it was done using an equally non-standard__farqualifier.[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 pointerpis: 0x5555 * 0x10 + 0x0005 = 0x55555
Location pointed to by pointerqis: 0x5333 * 0x10 + 0x2225 = 0x55555
So,pandqboth point to the same location 0x55555.

Notes

edit
  1. ^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
  1. ^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.
  2. ^"Introduction to Open Watcom C/C++".GitHub.2024.RetrievedFebruary 11,2024.