Far pointer

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search

Template:Short description Template:Use American English Template:Use mdy dates Template:More citations needed In a segmented architecture computer, a far pointer is a pointer to memory in a specific context,[1] such as a segment selector making 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 one physical address.

In 16-bit x86

Script error: No such module "labelled list hatnote". For example, in an Intel 8086, as well as in later processors running 16-bit code, a far pointer has two parts: a 16-bit segment value, and a 16-bit offset value. 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 normalized to a form with only one representation address. Such a normalized form may be one that minimizes the segment (maximizing the offset), minimizes the offset (maximizing the segment), or converts the 2-part segmented address to a (20-bit) linear representation. One commonly used normalized form minimizes the offset part of the address to a value less than 16 (10 hex): such a normalization can be computed simply by taking the low-order 4 bits of the unnormalized offset as the new offset, and adding to the unnormalized segment the unnormalized offset shifted right by 4 bits.

On C compilers targeting the 8086 processor family, far pointers were declared using a non-standard far qualifier; e.g., char far *p; defined a far pointer to a char. The difficulty of normalizing far pointers could be avoided with the non-standard huge qualifier. On other compilers it was done using an equally non-standard __far qualifier.[2]

Example of far pointer:

#include <stdio.h>
int main() {
   char far *p =(char far *)0x55550005;
   char far *q =(char far *)0x53332225;
   *p = 80;
   (*p)++;
   printf("%d",*q);
   return 0;
}
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 and q both point to the same location 0x55555.

Notes

Template:Reflist

References

Template:Reflist

  1. Cite error: Invalid <ref> tag; no text was provided for refs named mine23
  2. Cite error: Invalid <ref> tag; no text was provided for refs named wat24


Cite error: <ref> tags exist for a group named "Note", but no corresponding <references group="Note"/> tag was found