Дальний указатель - Far pointer - Wikipedia
Эта статья не цитировать любой источники.Декабрь 2009 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
В сегментированная архитектура компьютер, дальний указатель это указатель который включает селектор сегментов, что позволяет указывать на адреса за пределами сегмента по умолчанию.
Сравнение и арифметика дальних указателей проблематично: может быть несколько разных пар адресов сегмент-смещение, указывающих на один Физический адрес.
В 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.