Программисты, работающие на языке PL/M-386/486, могут получить доступ к очень полезному подмножеству возможностей процессораi486. Тип данных REAL языка PL/M-386/486 соответствует обычному вещественному формату (32 бита). Этот тип данных дает диапазон чисел порядка 8.43 x 10**(-37) <= ▀X▀ <= 3.38 x 10**(38) и имеет около семи значимых десятичных цифр. Такое представление чисел отвечает многим применениям микрокомпьютеров. Преимущество при использовании типа данных REAL в том, что промежуточные результаты при вычисленииях представляются компилятором языка PL/M-386/486 в расширенном вещественном формате. Это означает, что полный диапазон представления чисел и точности процессора используется для промежуточных вычислений. Переполнение, отрицательное переполнение, ошибки округления более вероятны во время промежуточных вычислений, чем при получении конечного результата. Представление промежуточных результатов в вещественном формате с расширенной точностью уменьшает вероятность переполнения, отрицательного переполнения и исключает ошибки округления, как серьезные ошибки, до достижения конца вычислений.
Компилятор генерирует команды по обработке чисел с плавающей точкой для вычисления выражений, содержащих тип данных REAL в виде переменных или констант. Это означает, что сложение, вычитание, умножение, деление, сравнение и присваивание чисел типа REAL осуществляется модулем обработки данных с плавающей точкой. С другой стороны, выражения типа INTEGER вычисляются модулем обработки целочисленных операций.
Пять встроенных процедур (Таблица 18-1) дают программисту, работающему на языке PL/M-386/486 доступ к командам управления модулем по обработке данных с плавающей точкой. Перед любой арифметической операцией обычная программа на PL/M-386/486 будет инициализировать модуль, используя процедуру INIT$REAL$MATH$ UNIT, а затем для настройки конфигурации установит режим SET$REAL$MODE. Процедура SET$REAL$MODE загружает управляющее слово модуля обработки данных с плавающей точкой, и его 16-разрядный параметр имеет формат, указанный для управляющеего слова в Главе 14. Рекомендуемая величина этого параметра - 033H (округление до ближайшего, точность 64 бита, блокировка исключений устраняет ошибочные команды). Другие процедуры могут использоваться по усмотрению программиста.
Если любая исключение не заблокировано, то обработчик исключений должен иметь процедуру обработки в форме процедуры прерывания, которая вызывается через вектор прерывания номер 16. Обработчик может использовать процедуру GET$REAL$ERROR для получения младшего байта слова состояния модуля обработки операций с плавающей точкой и затем очистить флаги маски исключения. Байт, возвращаемый процедурой GET $REAL $ERROR cодержит флаги маски, которые могут быть проанализированы для определения номера исключения.
Процедуры SAVE$REAL$STATUS и RESTORE$REAL$STATUS обеспечивают многозадачный режим работы, в котором выполняемая задача, использующая модуль обаботки операций с плавающей точкой, может быть прервана другой задачей, также использующей модуль обработки операций с плавающей точкой. Операционная система отвечает за выполнение процедуры SAVE$REAL$STATUS перед выполнением любой команды, которая может повлиять на модуль обработки операций с плавающей точкой. Это процедуры INIT$REAL$ MATH$UNIT и SET$REAL$MODE, а также арифметические команды. Процедура SAVE$REAL$STATUS сохраняет состояние модуля обработки операций с плавающей точкой (регистры, статус, управляюще слово и так далее) в стеке памяти. Процедура RESTORE$ REAL$STATUS восстанавливает информацию о состоянии; прерванная задача может вызвать эти процедуры для восстановления состояния модуля обработки операций с плавающей точкой во время выполнения. Это дает возможность прерванной задаче начать выполнение с того места, когда задача была прервана.
Тавблица 18-1.Встроенные процедуры языка PL/M-386/486 +---------------------------------------------------------------+| | Команда | || Процедура | управления | Описание || | FPU | |+---------------------+------------+----------------------------|| INIT$REAL$MATH$UNIT | FINIT | Инициализирует FPU || STE$REAL$MODE | FLDSW | Устанавливает маски исклю- || | | чений, точность округле- || | | ния и управление бесконеч- || | | ностью || GET$REAL$ERROR | FNSTSW | Сохраняет, а затем очищает || | &FNCLEX | значение флагов || SAVE$REAL$STATUS | FNSAVE | Сохраняет состояние FPU || RESTORE$REAL$STATUS | FRSTOR | Восстанавливает состояние || | | FPU |+---------------------------------------------------------------+