Daleko ukazatel - Far pointer

V segmentované architektury počítače, je daleko ukazatel je ukazatel , který zahrnuje volič segmentu , což umožňuje bod z adres mimo výchozího segmentu.

Porovnání a aritmetika na vzdálených ukazatelích je problematické: na jednu fyzickou adresu může být několik různých párů adres s posunem segmentu .

V 16bitovém x86

Například v Intel 8086 , stejně jako v pozdějších procesorech se 16bitovým kódem, má vzdálený ukazatel dvě části: 16bitovou hodnotu segmentu a 16bitovou hodnotu offsetu . Lineární adresa se získá posunutím hodnoty binárního segmentu čtyřikrát doleva a následným přidáním hodnoty posunutí. Efektivní adresa je tedy 20 bitů (ve skutečnosti 21 bitů, což vedlo k obtočení adresy a bráně A20 ). Na jednu fyzickou adresu může být až 4096 různých párů adres s offsetem segmentu. Chcete-li porovnat dva vzdálené ukazatele, je třeba je nejprve převést (normalizovat) na jejich 20bitovou lineární reprezentaci.

Na kompilátorech C zaměřených na rodinu procesorů 8086 byly vzdálené ukazatele deklarovány pomocí nestandardního kvalifikátoru daleko . Například je definován vzdálený ukazatel na char . S nestandardním obrovským kvalifikátorem se dalo vyhnout obtížnosti normalizace vzdálených ukazatelů . char far *p;

Příklad vzdáleného ukazatele:

#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;
}
Výstup následujícího programu: 81; Protože obě adresy směřují na stejné místo.
Fyzická adresa = (hodnota registru segmentu) * 0x10 + (hodnota offsetu).
Umístění, na které ukazuje ukazatel 'p', je: 0x5555 * 0x10 + 0x0005 = 0x55555
Umístění, na které ukazuje ukazatel 'q', je: 0x5333 * 0x10 + 0x2225 = 0x55555
Takže p a q ukazují na stejné místo 0x55555.

Reference