Daleki wskaźnik

W komputerze o architekturze segmentowej daleki wskaźnik to wskaźnik , który zawiera selektor segmentu , umożliwiający wskazanie adresów poza segmentem domyślnym.

Porównanie i arytmetyka na dalekich wskaźnikach jest problematyczna: może istnieć kilka różnych par adresów z przesunięciem segmentu wskazujących na jeden adres fizyczny .

W 16-bitowym x86

Na przykład w procesorze Intel 8086 , a także w późniejszych procesorach z kodem 16-bitowym , daleki wskaźnik ma dwie części: 16-bitową wartość segmentu i 16-bitową wartość przesunięcia . Adres liniowy uzyskuje się poprzez czterokrotne przesunięcie binarnej wartości segmentu w lewo, a następnie dodanie wartości przesunięcia. Stąd efektywny adres to 20 bitów (właściwie 21 bitów, co doprowadziło do zawijania adresu i bramki A20 ). Może istnieć do 4096 różnych par adresów z przesunięciem segmentu wskazujących na jeden adres fizyczny. Aby porównać dwa odległe wskaźniki, należy je najpierw przekonwertować (znormalizować) do ich 20-bitowej reprezentacji liniowej.

W kompilatorach C przeznaczonych dla rodziny procesorów 8086 dalekie wskaźniki zostały zadeklarowane przy użyciu niestandardowego kwalifikatora dalekich . Na przykład znak daleko *p; zdefiniował daleki wskaźnik do char . Trudności w normalizowaniu dalekich wskaźników można uniknąć za pomocą niestandardowego ogromnego kwalifikatora.

Przykład dalekiego wskaźnika:

 
  
        
        
     
   
   
    0
 #include  <stdio.h>  int  main  ()  {  char  daleko  *  p  =  (  char  daleko  *  )  0x55550005  ;  znak  daleko  *  q  =  (  znak  daleko  *  )  0x53332225  ;  *  p  =  80  ;  (  *  p  )  ++  ;  printf  (  "%d"  ,  *  q  );  powrót  ;  } 
Wyjście następującego programu: 81; Ponieważ oba adresy wskazują tę samą lokalizację.
Adres fizyczny = (wartość rejestru segmentowego) * 0x10 + (wartość przesunięcia).
Lokalizacja wskazywana przez wskaźnik „p” to: 0x5555 * 0x10 + 0x0005 = 0x55555
Lokalizacja wskazywana przez wskaźnik „q” to: 0x5333 * 0x10 + 0x2225 = 0x55555
Tak więc zarówno p, jak i q wskazują na tę samą lokalizację 0x55555.