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.