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.