Дальний указатель
Эта статья нуждается в дополнительных цитатах для проверки . ( февраль 2024 г. ) |
В с сегментированной архитектурой компьютере дальний указатель — это указатель на память в определенном контексте. [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.
Примечания
[ редактировать ]- ^ Ранние процессоры x86 имели только 20-битную адресную шину, поэтому результаты выше 1 МБ оборачивались до нуля, отбрасывая бит переноса. ПК, использующие 80286 или новее, которые имели необходимые адресные строки, реализовали шлюз A20 для переключения этого поведения для обратной совместимости со старым программным обеспечением.
Ссылки
[ редактировать ]- ^ Миллер, Итан Л.; Невилл-Нил, Джордж; Бенетопулос, Ахиллес; Мехра, Панкадж; Биттман, Дэниел (декабрь 2023 г.). «Указатели в далекой памяти» . Коммуникации АКМ . 66 (12). Нью-Йорк: Ассоциация вычислительной техники . ISSN 0001-0782 . LCCN 61065941 . ОСЛК 1514517 . Викиданные Q1120519 . Проверено 11 февраля 2024 г.
- ^ «Введение в Open Watcom C/C++» . Гитхаб . 2024 . Проверено 11 февраля 2024 г.