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.