Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯЗЫК СИ_РУКОВОДСТВО ПРОГРАММИСТА.doc
Скачиваний:
18
Добавлен:
18.08.2019
Размер:
438.27 Кб
Скачать

5.5. Инициализация fpu

Перед использованием команд FPU необходимо провести

инициализацию и установку режима процессора FPU - как аппаратного,

так и реализованного эмулятором. Обычно инициализация выполняется

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

операции с ПЗ. Инициализацию можно безусловно отключить, используя

ключ 'К'. Это полезно при компиляции функций, которые содержат

операции с ПЗ, но могут быть использованы в чисто "целых"

приложениях, в которых операции с ПЗ не используются (пример -

функция _doscan() из стандартной библиотеки, которая содержит

команды преобразования для чисел с ПЗ, однако часто он используется

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

инициализации FPU (она выполняется в модуле $$init()) управляется

наличием глобальной ссылки "fpin$$", которая вставляется в программу

на стадии компилятора (C1).

5.6. Форматный вывод чисел с плавающей запятой

Поскольку арифметика с ПЗ используется во многих приложениях языка "СИ" не так уж часто, существует механизм исключения (при компоновке) функций форматного вывода чисел с ПЗ. По умолчанию включение функций форматного вывода чисел с ПЗ происходит при наличии в программе операций с ПЗ, однако включение этих функций может быть подавлено указанием в командной строке ключа '-Z'. Это может быть полезно для экономии памяти, если в программе используются операции с ПЗ, а вывод чисел с ПЗ не используется. Если функции не включены, а вывод чисел с ПЗ используется, то в поле числа будет выведен один символ'?' и необходимое для заполнения поля число заполнителей. Размер подпрограмм форматного вывода чисел с ПЗ около 2 блоков (1 Кбайт).

Включение функций форматного вывода чисел с ПЗ происходит при компоновкe и управляется наличием глобальной ссылки "$$fppr", которая (при необходимости) включается в программу на стадии компиляции (C1).

5.7. Оптимизация

Компилятор выполняет различные оптимизационные преобразования программы, в основном касающиеся оптимизации выражений. Кроме того, ключом 'X' может быть включена стадия оптимизатора (C2), которая будет выполняться после стадии компилятора. Стадия оптимизатора увеличивает общее время компиляции приблизительно на 20% (при наличии всех других стадий) и приводит, в-среднем, к уменьшению обьема результирующей программы и увеличению скорости ее выполнения на 3-5% (числа относятся и к скорости, и к обьему). При помощи ключа 'Т' можно запросить статистику стадии оптимизатора. Особенностью работы оптимизатора является то, что при обработке функции он помещает в оперативную память весь ее (ассемблерный) текст, поэтому для больших функций оптимизатору может не хватить оперативной памяти. Выход в такой ситуации - разбивать программу на более мелкие функции.

5.8. Компоновка

После компиляции полученные обьектные файлы должны быть скомпонованы с библиотеками (и друг с другом). Поставляются следующие модули и библиотеки:

SPEIS.OBJ Головной модуль для ЭВМ с EIS.

SPNHD.OBJ Головной модуль для ЭВМ без EIS (включение эмулятора ЕИС).

CXLIB.OBJ Стандартная библиотека.

INITNF.OBJ Модуль инициализации без эмуляции запроса # ОС UNIX.

NFTIO.OBJ Модуль нефайлового терминального ввода-вывода.

CRLIB.OBJ Библиотека системных функций ОС RT11.

CTLIB.OBJ Библиотека дополнительных системных функций TS монитора.

CMLIB.OBJ Библиотека стандартных математических функций.

ASPEIS.OBJ, ASPNHD.OBJ, CALIB.OBJ Головные модули для автономных программ и библиотека автономной поддержки.

ANTIO.OBJ Модуль/заглушка для отключения терминального ввода/вывода в автономных программах.

LINK PROG,C:SPEIS,C:CXLIB/BOTTOM:2000 или

R LINK

PROG=PROG,C:SPEIS,CXLIB/B:2000

^C

В общем случае файлы при компоновке должны указываться в следующем порядке:

1.Объектные файлы программы пользователя.

2.Модули нестандартной конфигурации исполняющей системы (если они необходимы): INITNF.OBJ, NFTIO.OBJ, AFTIO.OBJ.

3.Головной модуль SPEIS или SPNHD

Головной модуль не включен в стандартную библиотеку, т.к. некоторые старые версии компоновщика ОС RT11 отказываются компоновать программу с правильным стартовым адресом, если модуль, с которого производится запуск программы, находится в библиотеке.

4.дополнительные библиотеки (CRLIB, CTLIB, CMLIB и др., а также библиотеки пользователя).

5.Стандартная библиотека CXLIB.

Ключ "BOTTOM" в командной строке определяет (octal) верхнюю границу

пространства, отводимого под стек (по умолчанию верхняя граница

равна 01000). Причина необходимости увеличения отводимого под стек

пространства в том, что программы, написанные на "СИ", в стеке

размещают свои локальные (автоматические) переменные. Простые программы могут работать и с обычным стеком (01000), а для сложных программ (с большим обьемом автоматических переменных или с большой глубиной вложенности вызовов) для стека может понадобиться пространство с верхней границей больше 02000. Переполнение стека приводит, как правило, к фатальным системным ошибкам типа и может нарушить работу операционной системы (если используется не TS монитор). Рекомендуется при отладке использовать ключ 'P' компилятора, см. "Средства отладки". При этом будет диагностироваться опускание стека ниже 0600.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]