
- •Система команд fpu
- •Задание.
- •Лабораторная работа № 8 Вычисления с использованием математического сопроцессора
- •Задание.
- •Лабораторная работа № 9 Представление данных в математическом сопроцессоре
- •Особые случаи
- •1. Неточный результат
- •2. Численное антипереполнение или исчезновение порядка
- •3. Денормализованный операнд
- •4. Деление на нуль
- •5. Численное переполнение
- •6. Недействительная операция
- •Задание.
- •Литература
Министерство образования и науки Российской Федерации
Псковский государственный политехнический институт
И.А. Полетаев
О.А. Полетаева
Организация ЭВМ
Методические указания к лабораторным работам
Псков
2007
ЛАБОРАТОРНАЯ РАБОТА № 7
Программная модель математического сопроцессора
Программно доступные регистры математического сопроцессора (далее FPU) представлены на рис. 7.1.
Рис. 7.1. Регистры FPU
Регистры данных образуют регистровый стек из восьми 80-битных регистров R0-R7, также называемых численными или арифметическими регистрами. В них хранятся числа, представленные в форме с плавающей точкой в расширенном вещественном формате, который является единственным внутренним форматом FPU.
Трехбитное поле ТОР (TOP of stack) из регистра состояния, определяет регистр, являющийся текущей вершиной стека и обозначаемый ST(0) или просто ST. Если, например, в поле ТОР содержится 011b=3 (см. рис. 7.1), то вершиной стека будет регистр R3, и именно он указывается в командах как ST. Этот регистр содержит последнее включенное (загруженное) в стек значение, регистр ST(1) – предпоследнее и так далее. Более того, все команды FPU рассчитаны на такую относительную адресацию, и даже на языке ассемблера нельзя работать с физическими регистрами R0-R7.
Операция загрузки или включения в стек (push) производит декремент поля ТОР и загружает данные в новую вершину стека, что приводит к перенумерации регистров. В операции сохранения или извлечения из стека (pop) в получатель, например в ячейку памяти, передается содержимое текущей вершины стека, регистр помечается как свободный, а затем производится инкремент поля ТОР.
Организация регистров соответствует классическому стеку, который в большинстве случаев реализуется в памяти. Но есть и некоторые отличия.
Организация стека – кольцевая. То есть при декременте (включении) из значения поля ТОП 000b получается значение 111b, при инкременте из 111b – 000b, без какого-либо уведомления.
В численных командах есть модификации не только с автоматическим изменением поля ТОР, но и без его изменения.
Рис. 7.2. Формат регистра тэгов
Каждому физическому регистру стека поставлен в соответствие двухбитный тэг (признак), совокупность которых образует слово тэгов (Tag Word), представленное на рис. 7.2. Тэг в общем виде показывает, что содержится в соответствующем регистре и помогает FPU в выполнении команд.
Каждое из восьми полей тегов интерпретируется следующим образом:
00 (Valid) – нормализованное вещественное число;
01 (Zero) – нуль;
10 (Special) – специальное значение;
11 (Empty) – пустой регистр (отсутствие данных).
Точные значения тэгов образуются при выполнении команд сохранения среды FSTENV или сохранения полного состояния FSAVE в соответствии с фактическим содержимым регистров стека. При выполнении других команд отмечается только наличие или отсутствие данных.
Рис. 7.3. Формат регистра управления
Структура регистра управления (Control Register) представлена на рис. 7.3. Для каждого варианта обработки данных программист может задать вариант маскирования особых случаев, точность вычислений и способ округления, или оставить вариант инициализации FPU по умолчанию.
Один из четырех режимов округления выбирается полем RC (Rounding Control):
00 – округление по правилам арифметики или к ближайшему;
01 – округление к отрицательной бесконечности или вниз;
10 – округление к положительной бесконечности или вверх;
11 – усечение или округление с отбрасыванием (к нулю).
Двухбитное поле управления точностью PC (Precision Control) определяет точность вычислений:
00 – 24 бита;
10 – 53 бита;
11 – 64 бита.
Расширенный вещественный формат обеспечивает точность 64 бита и является стандартным для FPU. Остальные режимы предусмотрены в стандарте вещественного числа IEEE754 и используются только для совместимости с некоторыми языками программирования. Уменьшение точности приводит к округлению полученного значения, но на производительность не влияет.
Шесть младших бит представляют собой маски особых случаев. Если любой из этих бит установлен в 1, то при возникновении соответствующего особого случая возвращается особое значение, а прерывания не возникает. Если бит сброшен в 0, то будет вызвано прерывание процессора. Биты масок перечислены в табл. 7.1.
Таблица 7.1. Биты масок в регистре управления
Обозначение маски |
Название |
PM (Precision Mask) |
маска точности |
UM (Underflow Mask) |
маска антипереполнения |
OM (Overflow Mask) |
маска переполнения |
ZM (divide-by-Zero Mask) |
маска деления на нуль |
DM (Denormalized Mask) |
маска денормализованного операнда |
IM (Invalid operation Mask) |
маска недействительной операции |
Бит 12 (IC, Infinity Control) сейчас FPU игнорирует, а в сопроцессорах 8087 и 80287 он управлял режимом интерпретации бесконечности: 0 – проективная (беззнаковая) бесконечность; 1 – аффинная (со знаком). Начиная с сопроцессора 80386 используется только аффинный режим. Сопроцессор 8087 так же имел бит общей маски прерывания IEM (бит 7).
Рис. 7.4. Формат регистра состояния
16-битное слово состояния (Status Register) отражает общее состояние FPU. Его можно сохранить для последующего анализа центральным процессором не только в ячейке памяти, но и в регистре АХ. Его структура представлена на рис. 7.4.
В слове состояния младшие 6 бит отведены для регистрации особых случаев (подробнее см. лаб. работу №9), расположение бит соответствует битам масок регистра управления. Назначение флагов приведено в табл. 7.2.
Таблица 7.2. Флаги регистра состояния FPU
Обозначение |
Пояснение |
В (Busy) |
Бит занятости; используется только для обеспечения совместимости с сопроцессором 8087. Устанавливается в 1, если зафиксирован незамаскированный особый случай в битах 5‑0. |
С3-С0 |
Биты кода условия, похожи на арифметические флаги и фиксируют особенности команд сравнения, проверки и анализа. |
ТОР (TOP of stack) |
Указатель стека – определяет регистр, являющийся текущей вершиной стека |
ES (Error Summary) |
Суммарная ошибка; устанавливается в 1 при возникновении любого незамаскированного особого случая и участвует в формировании прерывания центрального процессора. |
SF (Stack Fault) |
Нарушение стека; устанавливается в 1, если команда вызывает переполнение (включение девятого числа в стек) или антипереполнение (переопустошение, извлечение из пустого стека). |
PE (Precision Error) |
Ошибка точности – истинный результат операции точно не представим в формате получателя, результат округляется в соответствии с режимом округления. |
UE (Underflow Error) |
Ошибка антипереполнения – истинный результат операции не равен нулю, но слишком мал для представления как нормализованное число. |
OE (Overflow Error) |
Ошибка переполнения – результат операции слишком велик для представления. |
ZE (divide-by-Zero Error) |
Ошибка деления на нуль – делитель равен нулю, а делимое является не нулевым числом и не бесконечностью. |
DE (Denormalized operand Error) |
Ошибка денормализованного операнда – минимум один из операндов денормализован, то есть имеет наименьший порядок (0), целая часть мантиссы равна нулю, а дробная не равна. |
IE (Invalide operation Error) |
Ошибка недействительной операции – включает все особые ситуации, не выявленные предыдущими особыми случаями. |
Формирование и анализ регистров FPU производятся командами центрального процессора (ЦП). Прочитать в регистры ЦП можно только регистр состояния (в аккумулятор АХ). Работать напрямую с регистрами состояния и управления можно в памяти, используя любые методы адресации ЦП. Остальные же регистры напрямую недоступны.
Но можно получить доступ командам ЦП ко всем описанным регистрам FPU через область сохранения контекста сопроцессора, которая обычно используется при переключении задач.
Можно сохранять, а затем анализировать в памяти как все регистры FPU, так и только системные регистры без арифметического стека (контекст или среду). Как ЦП, так и FPU имеют несколько режимов работы: с одной стороны, реальный и защищенный режимы (R- и Р-режимы), с другой образы могут быть как 32-разрядными, так и 16-разрядными. Формат сохраненной в памяти среды для Р- и R-режима приведены на рис. 7.5-7.6.
Рис. 7.5. Образ контекста FPU в 16-битном Р-режиме
Рис. 7.6. Образ контекста FPU в 16-битном R-режиме
Резервирование памяти как для ЦП, так и для FPU в сегменте данных производится следующими директивами:
DB – выделяется один байт памяти;
DW – слово (2 байта);
DD – двойное слово (4 байта);
DQ – учетверенное слово (8 байт);
DT – десятибайтное слово.
Если значение данного заранее не известно, то за директивой следует знак «?», при определенном значении пишется константа в зависимости от типа выделяемого слова: целое, вещественное, десятичное. По размеру выделенного участка памяти автоматически определяется тип данного. Если выполняется косвенная адресация к ячейке памяти, то тип операнда надо задавать явно:
Byte ptr – для байта;
Word ptr – для слова;
Dword ptr – для двойного слова;
Qword ptr – для учетверенного слова;
Tbyte ptr – для десятибайтного слова.
Далее следует фрагмент программы, в котором описание сегмента данных начинается с задания области для сохранения рабочей среды FPU. Имя первой переменной указывается для сохранения или восстановления всей области.
.DATA
; область памяти, содержащая образ рабочей среды FPU
c_r dw ? ; регистр управления
s_r dw ? ; регистр состояния
t_w dw ? ; слово тэгов
i_p dw ? ; смещение команды
c_s dw ? ; селектор (адрес сегмента) команды
d_p dw ? ; смещение данного
d_s dw ? ; селектор данного
; разные типы данных с определением
; вещественных начальных значений
x1 dd 1.25 ; двойное слово
y1 dq 1e-8 ; учетверенное слово
z1 dt 0.01 ; десятибайтное слово
.CODE
mov ax,@data
mov ds,ax ; определение сегмента данных
. . .
Это самое простое описание. Обычно такие области задают с помощью записи или структуры.
Система команд fpu
Таблица 7.3. Команды передачи данных
Обозначение |
Пояснение |
Команды включения в стек (загрузки) |
|
FLD <источник> |
число с плавающей точкой |
FILD <источник> |
целое число |
FBLD <источник> |
десятичное число (10 байт) |
Команды извлечения из стека (и запоминания) |
|
FSTP <приемник> |
число с плавающей точкой |
FISTP <приемник> |
целое число |
FBSTP <приемник> |
десятичное число (10 байт) |
Команды копирования (без извлечения из стека) |
|
FST <приемник> |
число с плавающей точкой |
FIST <приемник> |
целое число |
Команда обмена (с вершиной стека) |
|
FXCH <регистр FPU> |
регистр ST задан неявно |
Команды включения в стек констант |
|
FLDZ |
загрузить нуль |
FLD1 |
загрузить единицу |
FLDPI |
загрузить π |
FLDLG2 |
загрузить log102 |
FLDLN2 |
загрузить loge2 |
FLDL2T |
загрузить log210 |
FLDL2E |
загрузить log2e |
Форматы команд сопроцессора аналогичны форматам команд центрального процессора. Коды операций всех команд начинаются с пяти бит 11011, которые соответствуют коду операции ESC и предупреждают центральный процессор, чтобы он не пытался выполнить такую команду как свою.
Ассемблерные мнемоники команд FPU начинаются с буквы F, а команды делятся на пять групп:
команды передачи данных;
арифметические команды;
команды сравнений;
трансцендентные команды;
административные команды (управления).
В свою очередь, команды передачи данных делятся на 5 групп, приведенных в табл. 7.3.
В качестве источника или приемника выступают ячейки ОЗУ, которые можно адресовать любым методом, так как доступ к операндам команд FPU выполняет ЦП. Для команд FLD и FST операндами могут быть и регистры FPU: при этом идет копирование содержимого ST(i) в вершину стека или наоборот.
В команде FIST не допускается получатель в формате десятичного целого, а FST – расширенной точности. Это объясняется недостатком наборов для кодов операций устройства FPU.
Так как команды FPU могут выполняться достаточно долго (особенно трансцендентные), то ЦП, прежде чем передать FPU следующую команду, должен проверить его занятость. Для этого предназначена команда WAIT (или FWAIT). Она проверяет занятость FPU, а затем проверяет наличие незамаскированных особых случаев для из возможной обработки. Но вручную эти команды расставлять нет необходимости: ассемблер это делает автоматически.
Некоторые административные команды можно выполнять без ожидания и контроля особых случаев. В таких командах после буквы F ставится буква N – перед ними ассемблер команду WAIT не вставляет.
Для работы и доступа к нечисленным регистрам FPU можно использовать административные команды, приведенные в табл. 7.4.
Таблица 7.4. Административные команды
Обозначение |
Пояснение |
F(N)STCW <память> |
запомнить слово управления |
FLDCW <память> |
загрузить слово управления |
F(N)STSW <память> |
запомнить слово состояния |
F(N)STSW АХ |
запомнить слово состояния в АХ |
F(N)CLEX |
сбросить особые случаи |
F(N)INIT |
сбросить FPU |
F(N)STENV <память> |
запомнить среду (контекст) |
FLDENV <память> |
загрузить среду (контекст) |
F(N)SAVE <память> |
запомнить полное состояние |
FRSTOR <память> |
восстановить полное состояние |
FINCSTR |
инкремент указателя стека |
FDECSTR |
декремент указателя стека |
FFREE |
освободить регистр |
FNOP |
нет операции |
FSETPM |
установить защищенный режим |
В качестве операнда <память> может выступать любой из методов адресации ЦП области ОЗУ, например, прямая адресация для приведенного выше фрагмента описания области сегмента данных:
FNSTENV c_r
По этой команде в области памяти, помеченной, начиная с метки c_r, сохранится 14 байт с содержимым регистров в соответствии с рис. 7.5-7.6 для 16-битного режима или 28 байт для 32-битного режима.
Команды FSAVE и RFSTOR работают с областью размером 94 или 112 байт, то есть дополнительно сохраняется и восстанавливается содержимое 8 арифметических регистров по 10 байт.
В процессорах с блоком ХММ (начиная с Pentium III) появились новые команды сохранения и восстановления контекста всех блоков FPU, MMX и XMM. Сохраняемые образы имеют иной формат.