Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Операции с сегментами

Добавление или вычитание значений из селекторной части ука-

зателя обычно не допускается. Например, добавление к селекторной

части указателя $1000 в реальном режиме увеличивает указатель на

64К, но в защищенном режиме результирующий указатель будет недо-

пустимым. Вместо этого для выделения и управления блоками памяти

следует использовать функцию GlobalXXXX модуля WinAPI.

В Borland Pascal существует способ выполнения арифметических

операций с селекторами с помощью переменной SelectorInc (см. ни-

же).

Использование сегментных регистров в качестве временных переменных

В реальном режиме некоторые старые программы на ассемблере

используют сегментные регистры для хранения временных переменных.

В защищенном режиме это работать не будет, так как обычно сохра-

няемые в сегментных регистрах временные значения не являются до-

пустимыми селекторами.

Доступ к памяти вне границ сегмента

В реальном режиме каждый сегмент имеет размер 64К. В защи-

щенном режиме дескриптор сегмента содержит поле, специфицирующее

предельный размер сегмента, и если вы пытаетесь обратиться к дан-

ным вне границ сегмента, по получите сбой GP. При загрузке прик-

ладной программы администратор этапа выполнения устанавливает со-

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

стека. Кроме того, блок памяти, распределяемый с помощью функции

GlobalAlloc модуля WinAPI, имеет предельное значение сегмента,

соответствующее размеру блока памяти.

Запись в сегмент кода

В реальном режиме можно записывать переменные в сегмент ко-

да, поскольку реальные режим не определяет, что может и что не

может существовать в сегменте. В защищенном режиме это не так.

Селектор защищенного режима имеет флаг чтения/записи или доступа

только по чтению, а селекторы кода всегда отмечены как доступные

только по чтению. Если вы пытаетесь записывать в селектор сегмен-

та кода, происходит сбой GP. Однако вы можете использовать псев-

доним и написать самомодифицирующийся код (см. ниже).

Разыменование указателей nil

При преобразовании прикладной программы реального режима в

защищенный режим, в программе, которая уже годы работала без оши-

бок, возможно внезапное появление определенных ошибок. Например,

вы можете случайно разыменовывать указатель nil, или обнаружите,

что ваша программа содержит "потерянные" указатели, которые разы-

меновываются после их освобождения. В реальном режиме такие ошиб-

ки не обязательно проявляются, но в защищенном режиме они обычно

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

значительно лучше предохраняет вас от ошибок, связанных с указа-

телями.

Сегменты кода и данных

Аналогично программе Borland Pascal реального режима, прог-

рамма защищенного режима содержит несколько сегментов кода, сег-

мент данных и сегмент стека. При загрузке программы защищенного

режима администратор этапа выполнения автоматически выделяет се-

лекторы для сегментов кода, данных и стека. Для сегментов кода

с помощью директивы компилятора $C можно управлять отдельными ат-

рибутами. В частности, сегменты кода можно сделать перемещаемыми

или фиксированными в физической памяти, они могут загружаться

предварительно или по запросу, а также могут быть выгружаемыми

или постоянными.

Примечание: Подробнее о директиве компилятора $C расс-

казывается в Главе 21 данного руководства и в Главе 2 ("Ди-

рективы компилятора") "Справочного руководства программис-

та".

Атрибуты сегмента кода позволяют вам обозначать сегмент как

статический (перемещаемый, предварительно загружаемый, постоян-

ный) или динамический (перемещаемый, загружаемый по запросу, выг-

ружаемый). Таким образом, в защищенном режиме вам не нужно ис-

пользовать модуль Overlay и директиву компилятора $O, и в версии

модуля System для защищенного режима переменные OvrXXXXXX отсутс-

твуют.

Соседние файлы в предмете Программирование на Pascal