Jump to content

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

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

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

В 16-битной версии x86

[ редактировать ]

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

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

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

#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 г.). «Указатели в далекой памяти» . Коммуникации АКМ . 66 (12). Нью-Йорк: Ассоциация вычислительной техники . ISSN   0001-0782 . LCCN   61065941 . ОСЛК   1514517 . Викиданные   Q1120519 . Проверено 11 февраля 2024 г.
  2. ^ «Введение в Open Watcom C/C++» . Гитхаб . 2024 . Проверено 11 февраля 2024 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f413b56684e8a66e85f5505efa5901b6__1722891240
URL1:https://arc.ask3.ru/arc/aa/f4/b6/f413b56684e8a66e85f5505efa5901b6.html
Заголовок, (Title) документа по адресу, URL1:
Far pointer - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)