- •Часть 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
 
Глава 15. Использование сопроцессора 80x87
В Borland Pascal вы можете работать с двумя типами чисел -
целыми (короткими целыми - Shortint, целыми - Integer, длинными
целыми - Longint, целыми длиной в байт - Byte, целыми длиной в
слово - Word) и вещественными (вещественными - Real, вещественны-
ми одинарной точности - Single, вещественными двойной точности -
Double, повышенной точности - Extended, сложными - Comp). Вещест-
венные числа называют также числами с плавающей точкой (плавающей
запятой). Для облегчения работы с целыми числами создан процессор
8086, но для работы с вещественными числами на этом процессоре
затрачивается гораздо больше времени и усилий. Для семейства про-
цессоров 8086 предназначено соответствующее семейство вспомога-
тельных специализированных процессоров для математических вычис-
лений (сопроцессоров) 80x87.
Процессор 80x87 - это специальный сопроцессор для обработки
чисел, который может входить в состав вашего компьютера РС. С по-
мощью него операции с плавающей точкой выполняются очень быстро.
Поэтому если вы собираетесь использовать большой объем вычислений
с плавающей точкой, то вам, вероятно, понадобится сопроцессор.
Borland Pascal построен таким образом, что он обеспечивает
оптимальное выполнение операций с плавающей точкой независимо от
наличия сопроцессора 80x87.
* Для программ, работающих на компьютере РС, независимо от
того, оснащен он сопроцессором 80x87 или нет, в Borland
Pascal предусмотрено использование вещественных чисел и
соответствующая библиотека программ, которые предназначены
для выполнения операций с плавающей точкой. Числа вещест-
венного типа занимают 6 байт памяти. При этом обеспечива-
ется представление чисел в диапазоне от 2.9х10^-39 до
1.7х10^38 с 11-12 значащими цифрами. Программы в библиоте-
ке программ для работы с плавающей точкой оптимизированы
по скорости и по размеру и используют самые новейшие
средства процессора 80x87.
* Если вы пишете программы, использующиеся только на компь-
ютерах, оснащенных сопроцессором 80x87, то вы можете ука-
зать Borland Pascal на необходимость получения выполняемо-
го кода, в котором используется плата процессора 80x87.
Это даст вам возможность использования четырех дополни-
тельных типов вещественных чисел (одинарной и двойной точ-
ности, повышенной точности, сложного типа) и расширенный
диапазон представления чисел с плавающей точкой - от
1.9х10^-4951 до 1,1х10^4943 с 19-20 значащими цифрами.
С помощью директивы компилятора $N или параметра меню
Options¦Cоmpiler (Параметры¦Компилятор) 80x87/80287 можно перек-
лючаться между различными моделями генерации кода с плавающей
точкой. По умолчанию используется состояние {$N-}. В этом состоя-
нии компилятор использует 6-байтовую библиотеку с плавающей точ-
кой, что позволяет вам работать только с переменными типа Real. В
состоянии {$N+} компилятор генерирует код для сопроцессора 80x87,
что дает вам дополнительную точность и доступ к 4 дополнительным
вещественным типам.
В Windows при компиляции с режимом числовой обработки, то
есть с директивой {$N+}, убедитесь, что в вашей системе можно
найти библиотеку эмуляции Windows 8087 - WIN87EM.DLL. Эта библио-
тека обеспечивает необходимый интерфейс между сопроцессором
80х87, Windows и вашей прикладной программой. Если сопроцессор
80х87 в вашей системе отсутствует, то библиотека WIN87EM.DLL бу-
дет эмулировать его программно. Эмуляция существенно замедляет
работу по сравнению с реальным сопроцессором 80х87, но обеспечи-
вает выполнение вашей прикладной программы на любой машине.
В реальном или защищенном режиме DOS, даже если у вас нет
сопроцессора 8087, вы можете указать Borland Pascal, что нужно
включить библиотеку исполняющей системы, которая эмулирует ариф-
метический сопроцессор 8087. В случае наличия сопроцессора 8087
он используется. Если сопроцессор отсутствует, его работа эмули-
руется библиотекой исполняющей системы (за счет некоторой потери
скорости работы программы).
Для разрешения и запрещения эмуляции сопроцессора 8087 ис-
пользуются директива компилятора $E и параметр Emulation (Эмуля-
ция) меню Options¦Compiler (Параметры¦Компилятор). По умолчанию
используется состояние {$E+}. В этом состоянии в программу авто-
матически включается полная эмуляция сопроцессора 8087. В состоя-
нии {$E-} используется существенно меньшая часть библиотеки с
плавающей точкой, а полученный в результате файл .EXE будет рабо-
тать только на машинах с сопроцессором 8087.
В приложении Windows директива компилятора $E не действует.
Не действует она также в модуле. Более того, если программа ком-
пилировалась с директивой {$N-}, а все модули программы компили-
ровались с директивой {$N+}, то библиотека исполняющей системы
для сопроцессора 8087 не требуется, и директива компилятора $E
игнорируется.
Прикладной программе Windows не требуется библиотека испол-
няющей системы 80x87. Вместо этого ей нужно поддерживающая библи-
отека WIN87EM.DLL, поставляемая с Windows, которая обеспечивает
необходимый интерфейс между вашей прикладной программой, Windows
и сопроцессором. Таким образом, в Windows даже при наличии в ва-
шей системе сопроцессора 80х87 для выполнения программ, скомпили-
рованных в состоянии {$N+}, должна присутствовать библиотека эму-
ляции WIN87EM.DLL (данная библиотека - это часть Windows, а не
Borland Pascal). При отсутствии сопроцессора WIN87EM.DLL будет
эмулировать его операции программным путем, что замедляет выпол-
нение программы и не гарантирует, что использующая сопроцессор
80x87 программа сможет работать на любой машине.
Когда вы запускаете прикладную программу Windows, cкомпили-
рованную в состоянии {$N+}, убедитесь, что она может найти в сис-
теме файл WIN87EM.DLL.
Когда вы выполняете компиляцию в режиме кода 80х87 (директи-
ва {$N+}), то возвращаемые подпрограммы модуля Systем (Sqrt, Рi,
Sin и т.д.) значения представляют собой не вещественные числа, а
числа типа Extended (с повышенной точностью).
{$N+}
begin
Writeln(Pi); { 3.14159265358979E+0000 }
end.
{$N-}
begin
Writeln(Pi); { 3.1415926536E+00 }
end.
В оставшейся части данной главы обсуждаются специальные воп-
росы, касающиеся использования процессора 80x87 в программах
Borland Pascal.
