Дальний указатель

Обращение к памяти за пределами непосредственной близости

В компьютере с сегментированной архитектурой дальний указатель — это указатель на память в определенном контексте [1] , например, селектор сегмента, позволяющий указывать на адреса за пределами сегмента по умолчанию.

Сравнение и арифметика для дальних указателей проблематичны: может быть несколько различных пар адресов сегмент-смещение, указывающих на один физический адрес .

В 16-битной x86

Например, в Intel 8086 , а также в более поздних процессорах, работающих с 16-битным кодом, дальний указатель состоит из двух частей: 16-битного значения сегмента и 16-битного значения смещения . Линейный адрес получается путем сдвига двоичного значения сегмента четыре раза влево с последующим добавлением значения смещения. Следовательно, эффективный адрес составляет 21 бит [Примечание 1] . Может быть до 4096 различных пар адресов сегмент-смещение, указывающих на один физический адрес. Чтобы сравнить два дальних указателя, их необходимо сначала преобразовать (нормализовать) в их линейное представление.

На компиляторах C , ориентированных на семейство процессоров 8086, дальние указатели объявлялись с использованием нестандартного квалификатора; например, определялся дальний указатель на char . Трудности нормализации дальних указателей можно было избежать с помощью нестандартного квалификатора. На других компиляторах это делалось с использованием столь же нестандартного квалификатора. [2]farchar far *p;huge__far

Пример дальнего указателя:

#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 ; }                      
Вывод следующей программы: 81; Поскольку оба адреса указывают на одно и то же местоположение.
Физический адрес = (значение сегментного регистра) * 0x10 + (значение смещения).
Местоположение, на которое указывает указатель p: 0x5555 * 0x10 + 0x0005 = 0x55555
Местоположение, на которое указывает указатель q: 0x5333 * 0x10 + 0x2225 = 0x55555
pИтак , qоба указывают на одно и то же место 0x55555.

Примечания

  1. ^ Ранние процессоры x86 имели только 20-битную адресную шину, поэтому результаты свыше 1 МБ оборачивались до нуля, отбрасывая бит переноса. ПК, использующие 80286 или более новые, которые имели необходимые адресные линии, реализовали шлюз A20 для переключения этого поведения для обратной совместимости со старым программным обеспечением.

Ссылки

  1. ^ Миллер, Итан Л.; Невилл-Нил, Джордж; Бенетопулос, Ахиллес; Мехра, Панкадж; Биттман, Дэниел (декабрь 2023 г.). «Указатели в далекой памяти». Сообщения ACM . 66 (12). Нью-Йорк: Ассоциация вычислительной техники . ISSN  0001-0782. LCCN  61065941. OCLC  1514517. Wikidata  Q1120519 . Получено 11 февраля 2024 г.
  2. ^ "Введение в Open Watcom C/C++". GitHub . 2024 . Получено 11 февраля 2024 г. .
Retrieved from "https://en.wikipedia.org/w/index.php?title=Far_pointer&oldid=1238842586"