- •Часть I. Язык Borland Pascal Глава 1. Что такое программа Borland Pascal?
 - •Программа Borland Pascal
 - •Процедуры и функции
 - •Операторы
 - •Выражения
 - •Лексемы
 - •Типы, переменные, константы и типизированные константы
 - •Компоновка частей
 - •Синтаксические диаграммы
 - •Глава 2.Лексемы
 - •Специальные символы
 - •Зарезервированные слова и стандартные директивы Borland Pascal
 - •Идентификаторы
 - •Строки символов
 - •Комментарии
 - •Строки программы
 - •Глава 3. Константы
 - •Глава 4. Типы
 - •Простые типы
 - •Порядковые типы
 - •Целочисленные типы
 - •Булевские типы
 - •Символьный тип (char)
 - •Перечислимые типы
 - •Отрезки типа
 - •Вещественные типы
 - •Программная поддержка чисел с плавающей точкой
 - •Аппаратная поддержка чисел с плавающей точкой
 - •Строковые типы
 - •Структурные типы
 - •Типы массив
 - •Типы запись
 - •Объектные типы
 - •Компоненты и область действия
 - •Виртуальные методы
 - •Динамические методы
 - •Создание экземпляров объектов
 - •Активизация методов
 - •Активизация уточненных методов
 - •Множественные типы
 - •Файловые типы
 - •Ссылочные типы
 - •Тип Pointer
 - •Тип pChar
 - •Процедурные типы
 - •Процедурные значения
 - •Совместимость типов
 - •Тождественные и совместимые типы
 - •Тождественность типов
 - •Совместимость типов
 - •Совместимость по присваиванию
 - •Раздел описания типов
 - •Глава 5. Переменные и типизированные константы Описания переменных
 - •Сегмент данных
 - •Сегмент стека
 - •Абсолютные переменные
 - •Ссылки на переменные
 - •Квалификаторы
 - •Массивы, строки и индексы
 - •Записи и десигнаторы полей
 - •Десигнаторы компонентов объекта
 - •Переменные-указатели и динамические переменные
 - •Приведение типов переменных
 - •Типизированные константы
 - •Константы простого типа
 - •Константы строкового типа
 - •Константы структурного типа
 - •Константы типа массив
 - •Константы типа запись
 - •Константы объектного типа
 - •Константы множественного типа
 - •Константы ссылочного типа
 - •Константы процедурного типа
 - •Глава 6. Выражения
 - •Синтаксис выражений
 - •Операции
 - •Арифметические операции
 - •Унарные арифметические операции
 - •Логические операции
 - •Булевские операции
 - •Операция со строками
 - •Операции над символьными указателями
 - •Операции над множествами
 - •Операции отношения
 - •Сравнение простых типов
 - •Сравнение строк
 - •Сравнение упакованных строк
 - •Сравнение указателей
 - •Сравнение символьных указателей
 - •Сравнение множеств
 - •Проверка на принадлежность к множеству
 - •Операция @
 - •Использование операции @ для переменной
 - •Использование операции @ для процедуры или функции или метода
 - •Вызовы функции
 - •Описатели множества
 - •Приведение типа значений
 - •Процедурные типы в выражениях
 - •Глава 7. Операторы
 - •Простые операторым
 - •Оператор присваивания
 - •Операторы процедуры
 - •Операторы перехода
 - •Структурные операторы
 - •Составные операторы
 - •Условные операторы
 - •Оператор условия (if)
 - •Оператор варианта (case)
 - •Оператор цикла
 - •Оператор цикла с постусловием (repeat)
 - •Операторы цикла с предусловием (while)
 - •Операторы цикла с параметром (for)
 - •Оператор with
 - •Глава 8. Блоки, локальность и область действия
 - •Синтаксис
 - •Правила для области действия
 - •Область действия для блока
 - •Область действия записи
 - •Область действия объекта
 - •Область действия модуля
 - •Глава 9. Процедуры и функции
 - •Описания near и far
 - •Описания export
 - •Описания interrupt
 - •Описание forward
 - •Описания external
 - •Описания assembler
 - •Описания inline
 - •Описания функций
 - •Описания методов
 - •Конструкторы и деструкторы
 - •Восстановление ошибок конструктора
 - •Параметры
 - •Параметры-значения
 - •Параметры-константы
 - •Параметры-переменные
 - •Нетипизированные параметры
 - •Открытые параметры
 - •Открытые строковые параметры
 - •Открытые параметры-массивы
 - •Динамические переменные объектного типа
 - •Процедурные переменные
 - •Параметры процедурного типа
 - •Глава 10. Программы и модули Синтаксис программ
 - •Заголовок программы
 - •Оператор uses
 - •Синтаксис модулей
 - •Заголовок модуля
 - •Интерфейсная секция
 - •Секция реализации
 - •Секция инициализации
 - •Косвенные ссылки на модули
 - •Перекрестные ссылки на модули
 - •Совместное использование описаний
 - •Глава 11. Динамически компонуемые библиотеки
 - •Что такое dll?
 - •Использование dll
 - •Модули импорта
 - •Статический и динамический импорт
 - •Написание dll
 - •Директива процедуры export
 - •Оператор exports
 - •Код инициализации библиотеки
 - •Замечания по программированию библиотек
 - •Глобальные переменные в dll
 - •Глобальные переменные и файлы в dll
 - •Dll и модуль System
 - •Ошибки этапа выполнения в dll
 - •Dll и сегменты стека
 - •Создание совместно используемых dll
 - •Часть II. Глава 12. Библиотеки исполняющей системы
 - •Модули Borland Pascal
 - •Модуль System
 - •Модуль Dos и WinDos
 - •Модуль Crt
 - •Модуль WinCrt
 - •Модули Turbo3 и Graph3
 - •Модули WinTypes и WinProcs
 - •Модуль Win31
 - •Модуль WinApi
 - •Модули, поддерживающие Windows 3.1
 - •Глава 13. Стандартные процедуры и функции
 - •Процедуры управления работой программы
 - •Функции преобразования
 - •Арифметические функции
 - •Порядковые процедуры и функции
 - •Строковые процедуры и функции
 - •Процедуры и функции динамического распределения памяти
 - •Функции для работы с указателями и адресами
 - •Прочие процедуры и функции
 - •Предописанные переменные
 - •Глава 14. Ввод и вывод
 - •Файловый ввод-вывод
 - •Текстовые файлы
 - •Нетипизированные файлы
 - •Переменная FileMode
 - •Устройства в Borland Pascal
 - •Устройства dos
 - •Устройство cоn
 - •Устройства lрt1, lрt2 и lрt3
 - •Устройства cом1 и cом2
 - •Устройство nul
 - •Устройства, предназначенные для текстовых файлов
 - •Ввод и вывод с помощью модуля Crt
 - •Использование модуля crt
 - •Окна crt
 - •Специальные символы
 - •Ввод строк
 - •Процедуры и функции модуля Crt
 - •Константы и переменные модуля Crt
 - •Ввод и вывод с помощью модуля WinCrt
 - •Использование модуля WinCrt
 - •Специальные символы
 - •Ввод строк
 - •Процедуры и функции
 - •Переменные модуля WinCrt
 - •Печать из программы Windows
 - •Изменение заголовков
 - •Изменение шрифтов
 - •Остановка задания печати
 - •Специальные символы
 - •Процедуры и функции модуля WinPrn
 - •Функция Open
 - •Функция InOut
 - •Функция Flush
 - •Функция Clоsе
 - •Глава 15. Использование сопроцессора 80x87
 - •Типы данных процессора 80x87
 - •Арифметические операции с повышенной точностью
 - •Сравнение вещественных чисел
 - •Стек вычислений сопроцессора 80x87
 - •Запись вещественных чисел при использовании сопроцессора 80x87
 - •Модули, в которых используется сопроцессор 80x87
 - •Распознавание сопроцессора 80х87 в программах dos
 - •Распознавание сопроцессора 80x87 в программе Windows
 - •Использование эмуляции сопроцессора 80x87 на языке ассемблера
 - •Глава 16. Модуль Dоs
 - •Процедуры и функции модуля Dos
 - •Константы, типы и переменные модуля Dos
 - •Переменные модуля Dos
 - •Процедуры и функции модуля WinDos
 - •Константы, типы и переменные модуля WinDos
 - •Переменные модуля WinDos
 - •Глава 17. Программирование в защищенном режиме dos
 - •Что такое защищенный режим?
 - •Расширения Borland защищенного режима dos
 - •Dpmi-сервер
 - •Администратор этапа выполнения
 - •Разработка прикладных программ dos защищенного режима
 - •Надежное программирование в защищенном режиме
 - •Загрузка в сегментные регистры недопустимых значений
 - •Функция Ptr и массивы Mem
 - •Абсолютные переменные
 - •Операции с сегментами
 - •Использование сегментных регистров в качестве временных переменных
 - •Доступ к памяти вне границ сегмента
 - •Запись в сегмент кода
 - •Разыменование указателей nil
 - •Сегменты кода и данных
 - •Управление динамически распределяемой памятью
 - •Предопределенные селекторы
 - •Переменная SelectorInc
 - •Модуль WinApi
 - •Управление памятью
 - •Подпрограммы управления памятью api
 - •Управление модулем
 - •Управление ресурсами
 - •Управление селектором
 - •Другие подпрограммы api
 - •Прямой доступ к dpmi-серверу
 - •Компиляция прикладной программы защищенного режима
 - •Выполнение программы защищенного режима dos
 - •Управление объемом используемой rtm памяти
 - •Глава 18. Строки с завершающим нулем
 - •Что такое строка с завершающим нулем?
 - •Функции модуля Strings
 - •Использование строк с завершающим нулем
 - •Символьные указатели и строковые литералы
 - •Символьные указатели и символьные массивы
 - •Индексирование символьного указателя
 - •Операции с символьными указателями
 - •Строки с завершающим нулем и стандартные процедуры
 - •Пример использования функций с завершающим нулем
 - •Глава 19. Использование графического интерфейса Borland
 - •Драйверы
 - •Поддержка устройства ibm 8514
 - •Система координат
 - •Текущий указатель
 - •Графические изображения и их виды
 - •Области просмотра и двоичные образы
 - •Поддержка страниц и цветов
 - •Обработка ошибок
 - •Начало работы
 - •Пользовательские программы управления динамически распределяемой памятью
 - •Процедуры модуля Graph
 - •Константы, типы и переменные модуля Graph
 - •Константы
 - •Переменные
 - •Глава 20. Использование оверлеев
 - •Администратор оверлеев
 - •Управление оверлейным буфером
 - •Процедуры и функции модуля Overlay
 - •Коды результата
 - •Разработка программ с оверлеями
 - •Генерация оверлейного кода
 - •Требование использования дальнего типа вызовов
 - •Инициализация администратора оверлеев
 - •Разделы инициализации в оверлейных модулях
 - •Что не должно использоваться в качестве оверлеев
 - •Отладка оверлеев
 - •Внешние программы в оверлеях
 - •Задание функции чтения оверлея
 - •Оверлеи в файлах .Exe
 - •Часть III. В среде Borland Pascal Глава 21. Использование памяти
 - •Использование памяти программами реального режима dos
 - •Администратор динамически распределяемой области памяти dos
 - •Методы освобождения областей динамически распределяемой памяти
 - •Список свободных блоков
 - •Переменная HeapError
 - •Использование памяти в программах dos защищенного режима
 - •Сегменты кода
 - •Атрибуты сегмента
 - •Атрибуты moveable или fixed
 - •Атрибуты preload или demandload
 - •Атрибуты discardable или permament
 - •Сегменты данных и стека
 - •Изменение атрибутов
 - •Администратор динамически распределяемой области памяти dos
 - •Переменная HeapError
 - •Использование памяти в программах Windows
 - •Атрибуты сегментов
 - •Атрибуты moveable или fixed
 - •Атрибуты preload или demandload
 - •Атрибуты discardable или permanent
 - •Изменение атрибутов
 - •Сегмент локальных динамических данных
 - •Администратор динамически распределяемой области памяти
 - •Переменная HeapError
 - •Форматы внутреннего представления данных
 - •Целочисленные типы
 - •Символьный тип
 - •Булевский тип
 - •Перечислимый тип
 - •Типы с плавающей точкой
 - •Вещественный тип
 - •Тип числа с одинарной точностью
 - •Тип числа с двойной точностью
 - •Тип числа с повышенной точностью
 - •Сложный тип
 - •Значения типа указатель
 - •Значения строкового типа
 - •Значения множественного типа
 - •Значения типа массив
 - •Значения типа запись
 - •Объектные типы
 - •Значения файлового типа
 - •Процедурные типы
 - •Прямой доступ к памяти
 - •Прямой доступ к портам
 - •Глава 22. Вопросы управления
 - •Соглашения по вызовам
 - •Параметры-переменные
 - •Параметры-значения
 - •Открытые строковые параметры
 - •Результаты функций
 - •Ближние и дальние типы вызовов
 - •Вложенные процедуры и функции
 - •Соглашения о вызовах методов
 - •Вызовы виртуальных методов
 - •Вызовы динамических методов
 - •Конструкторы и деструкторы
 - •Стандартный код входа и выхода
 - •Соглашения по сохранению регистров
 - •Процедуры выхода
 - •Обработка прерываний
 - •Разработка процедур обработки прерываний
 - •Глава 23. Автоматическая оптимизация
 - •Свертывание констант
 - •Слияние констант
 - •Вычисление по короткой схеме
 - •Параметры-константы
 - •Устранение избыточной загрузки указателей
 - •Подстановка констант множественного типа
 - •Малые множества
 - •Порядок вычисления
 - •Проверка на допустимость границ
 - •Использование сдвига вместо умножения
 - •Автоматическое выравнивание на границу слова
 - •Удаление неиспользуемого кода
 - •Эффективная компоновка
 - •Часть IV. Использование Borland Pascal с языком ассемблера Глава 24. Встроенный ассемблер
 - •Оператор asm
 - •Использование регистров
 - •Синтаксис операторa ассемблера
 - •Размер инструкции ret
 - •Автоматическое определение размера перехода
 - •Директивы ассемблера
 - •Операнды
 - •Выражения
 - •Различия между выражениями Паскаля и ассемблера
 - •Элементы выражений
 - •Константы
 - •Числовые константы
 - •Строковые константы
 - •Регистры
 - •Идентификаторы
 - •Классы выражений
 - •Типы выражений
 - •Операции в выражениях
 - •Процедуры и функции ассемблера
 - •Глава 25. Компоновка с программами на языке ассемблера
 - •Турбо Ассемблер и Borland Pascal
 - •Примеры программ на языке ассемблера
 - •Методы на языке ассемблера
 - •Включаемый машинный код
 - •Операторы Inline
 - •Директивы inline
 
Переменные модуля WinDos
Многими подпрограммами модуля WinDos для сообщения об ошибке
используется переменная DosError.
Глава 17. Программирование в защищенном режиме dos
Микропроцессор 80286 дает новый способ адресации к памяти:
защищенный режим виртуальной адресации или просто защищенный ре-
жим. Этот новый режим адресации дает три основных преимущества:
* Адресация к памяти объемом до 16 мегабайт.
* Логическое адресное пространство, превышающее пространство
физических адресов.
* Способ изоляции программ друг от друга, так что одна прог-
рамма не может нарушать другой выполняющейся одновременно
с ней программы.
С помощью Borland Pascal вы легко можете писать работающие в
защищенном режиме прикладные программы DOS без необходимости при-
менения дополнительного "расширителя" DOS. Вы обнаружите, что
многие программы реального режима прекрасно работают в защищенном
режиме. Данная глава поможет вам модифицировать те программы, ко-
торые этого не делают, и прояснит некоторые основные моменты за-
щищенного режима и его отличия от реального режима.
Что такое защищенный режим?
Процессор 80286 и более поздние процессоры поддерживают два
режима операций: защищенный режим и реальный режим. Реальный ре-
жим совместим с работой процессора 8086 и позволяет прикладной
программе адресоваться к памяти объемом до одного мегабайта. За-
щищенный режим расширяет диапазон адресации до 16 мегабайт. Ос-
новное отличие между реальным и защищенным режимом заключается в
способе преобразования процессором логических адресов в физичес-
кие. Логические адреса - это адреса, используемые в прикладной
программе. Как в реальном, также и в защищенном режиме логический
адрес - это 32-разрядное значение, состоящее из 16-битового се-
лектора (адреса сегмента) и 16-битового смещения. Физические ад-
реса - это адреса, которые процессор использует для обмена данны-
ми с компонентами системной памяти. В реальном режиме физический
адрес представляет собой 20-битовое значение, а в защищенном ре-
жиме - 24-битовое.
Когда процессор обращается к памяти (для выборки инструкции
или записи переменной), он генерирует из логического адреса физи-
ческий адрес. В реальном режиме генерация физического адреса сос-
тоит из сдвига селектора (адреса сегмента) на 4 бита влево (это
означает умножение на 16) и прибавления смещения. Полученный в
результате 20-разрядный адрес используется затем для доступа к
памяти.
16Мб-----------------
¦ ¦
--------- ¦ ¦
¦Смещение+- ¦ ¦
L--------- ¦ ¦ ¦
¦ +----------------+
L--+----->----------¦+ сегмент 64К
-->+----------------+-
¦ ¦ ¦
¦ ¦ Пространство ¦
--------- ------- ¦ ¦ адресов ¦
¦Селектор+-+ x 16 +------ ¦ ¦
L--------- L------- ¦ ¦
0L-----------------
Рис. 17.1 Генерация физического адреса в реальном режиме.
Чтобы получить физический адрес в защищенном режиме, селек-
торная часть логического адреса используется в качестве индекса
таблицы дескрипторов. Запись в таблице дескрипторов содержит
24-битовый базовый адрес, к которому затем для образования физи-
ческого адреса прибавляется смещение логического адреса.
16Мб-----------------
¦ ¦
--------- ¦ ¦
¦Смещение+- ¦ ¦
L--------- ¦ ¦ ¦
¦ +----------------+
Таблица дескрипторов L--+----->----------¦+ сегмент 64К
------- -->+----------------+-
+------+ ¦ ¦ ¦
+------+ ¦ ¦ Пространство ¦
+------+ ¦ ¦ адресов ¦
-->+------+---- ¦ ¦
¦ +------+ ¦ ¦
¦ +------+ 0L-----------------
¦ +------+
¦ +------+
¦ +------+
¦ +------+
¦ +------+
¦ +------+
¦ +------+
¦ +------+
--------- ¦ +------+
¦Селектор+-- L-------
L---------
Рис. 17.2 Генерация физического адреса в защищенном режиме.
Каждая запись в таблице дескрипторов называется дескриптором
и определяет сегмент в памяти. Запись таблицы дескрипторов зани-
мает 8 байт, а записанная в дескрипторе информация включает в се-
бя базовый адрес, предельное значение и флаги полномочий доступа
к сегменту.
Записи предельного значения сегмента и полномочий доступа в
дескрипторе определяют размер и тип сегмента. Сегменты могут
иметь размер от 1 до 65536 байт и могут быть сегментами кода или
сегментами данных. Сегменты кода могут содержать выполняемые ма-
шинные инструкции и доступные только по чтению данные. Сегменты
данных могут содержать данные, доступные по чтению и записи. За-
писывать данные в сегменты кода или выполнять инструкции в сег-
ментах данных невозможно. Любая попытка сделать это или попытка
доступа к данным вне границ сегмента вызывает общий сбой по на-
рушению защиты (сокращенно сбой GP). Поэтому режим и называется
защищенным.
По данному адресу в реальном режиме прикладная программа мо-
жет определить физический адрес. В защищенном режиме это обычно
не так, поскольку селекторная часть логического адреса является
индексом в таблице дескрипторов, и сам селектор не имеет прямого
отношения к вычислению физического адреса. Это дает то преиму-
щество, что управление виртуальной памятью можно реализовать, не
влияя на прикладную программу. Например, путем простого обновле-
ния поля базового адреса дескриптора сегмента, операционная сис-
тема может перемещать сегмент в физической памяти без влияния на
использующую сегмент прикладную программу. Прикладная программа
ссылается только на селектор сегмента, и на селектор не влияют
изменения в дескрипторе.
Прикладная программа редко имеет дело с дескрипторами. При
необходимости дескрипторы создаются и уничтожаются операционной
системой и администратором памяти, а прикладная программа знает о
соответствующих селекторах. Селекторы аналогичны описателям фай-
лов - с точки зрения прикладной программы это то, что обслужива-
ется операционной системой, но в операционной системе они работа-
ют как индексы содержащих дополнительную информацию таблиц.
