Puntatore lontano - Far pointer

In un computer con architettura segmentata , un puntatore lontano è un puntatore che include un selettore di segmento , che consente di puntare a indirizzi al di fuori del segmento predefinito.

Il confronto e l'aritmetica sui puntatori lontani è problematico: possono esserci diverse coppie di indirizzi con offset di segmento che puntano a un indirizzo fisico .

In x86 a 16 bit

Ad esempio, in un Intel 8086 , così come nei processori successivi che eseguono codice a 16 bit , un puntatore lontano ha due parti: un valore di segmento a 16 bit e un valore di offset a 16 bit . Un indirizzo lineare si ottiene spostando il valore del segmento binario quattro volte verso sinistra e quindi aggiungendo il valore di offset. Quindi l'indirizzo effettivo è di 20 bit (in realtà 21 bit, che ha portato al wraparound dell'indirizzo e al Gate A20 ). Possono esserci fino a 4096 diverse coppie di indirizzi con offset di segmento che puntano a un indirizzo fisico. Per confrontare due puntatori lontani, è necessario prima convertirli (normalizzarli) nella loro rappresentazione lineare a 20 bit.

Sui compilatori C destinati alla famiglia di processori 8086, i puntatori far sono stati dichiarati utilizzando un qualificatore far non standard . Ad esempio, definito un puntatore lontano a un carattere . La difficoltà di normalizzare i puntatori lontani potrebbe essere evitata con il qualificatore enorme non standard . char far *p;

Esempio di puntatore lontano:

#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;
}
Risultato del seguente programma: 81; Perché entrambi gli indirizzi puntano alla stessa posizione.
Indirizzo fisico = (valore del registro del segmento) * 0x10 + (valore dell'offset).
La posizione puntata dal puntatore 'p' è: 0x5555 * 0x10 + 0x0005 = 0x55555
La posizione puntata dal puntatore 'q' è: 0x5333 * 0x10 + 0x2225 = 0x55555
Quindi, peq puntano entrambi alla stessa posizione 0x55555.

Riferimenti