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

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

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

В 16-битном x86

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

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

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

#включают <stdio.h>int главный() {   char далеко *п =(char далеко *)0x55550005;   char далеко *q =(char далеко *)0x53332225;   *п = 80;   (*п)++;   printf("% d",*q);   возвращаться 0;}
Вывод следующей программы: 81; Потому что оба адреса указывают на одно и то же место.
Физический адрес = (значение сегментного регистра) * 0x10 + (значение смещения).
Местоположение, на которое указывает указатель 'p': 0x5555 * 0x10 + 0x0005 = 0x55555
Местоположение, на которое указывает указатель q: 0x5333 * 0x10 + 0x2225 = 0x55555
Итак, p и q указывают на одно и то же место 0x55555.

Рекомендации