Команды математического сопроцессора

Математический сопроцессор дает возможность процессорам обрабатывать данные с плавающей запятой, которые широко используются в обработке изображения, а также в научных, инженерных и коммерческих приложениях. Ядро процессора IA-32, доступное программисту, реализует вычисления только над целыми числами, поэтому обработка вещественных чисел на нем, задача достаточно трудоемкая. Поэтому в состав процессора с архитектурой IA-32 входит математический сопроцессор (или блок обработки чисел с плавающей запятой, FPU). Математический сопроцессор, как отдельная микросхема, появился уже в первых ПК (связка процессор и соответствующий ему сопроцессор имели сходную нумерацию, например: процессор I80286, а сопроцессор к нему - I80287), а начиная с процессоров Intel486, математический сопроцессор в виде блока FPU стал размещаться на одном кристалле с процессором.

Архитектура процессоров IA-32 обрабатывает 3 типа данных с плавающей запятой: числа с плавающей запятой одинарной точности, числа с плавающей запятой двойной точности и числа с плавающей запятой расширенной двойной точности.

В таблице 27 приведено описание каждого из типов данных.

Таблица 27 - Типы данных чисел с плавающей запятой

Тип данных Разрядность Разрядность мантиссы (бит) Примерный нормализованный диапазон значений
2 с/с 10 с/с
Одинарная точность     от 2-126 до 2127 от 1,18·10-38 до 3,4·1038
Двойная точность     от 2-1022 до 21023 от 2,23·10-308 до 1,79·1038
Расширенная двойная точность     от 2-16382 до 216383 от 3,37·10-4932 до 1,18·104932

На рисунке 15 представлена исполнительная среда блока обработки чисел с плавающей запятой.

Рисунок 15 - Исполнительная среда блока FPU

Блок обработки чисел с плавающей запятой имеет свою систему команд и работает со своим набором регистров. При этом, выборку команд для блока FPU осуществляет процессор.

Команды блок FPU рассматривают регистры данных как стек (рисунок 16). При этом, адресация регистров данных осуществляется относительно вершины стека (адрес которой хранится в поле TOP регистра состояния). При загрузке данных в стек, адрес вершины стека уменьшается на 1 и загрузка осуществляется в тот регистр, на который указывает вершина стека. При считывании данных из стека, сначала считывается число из вершины стека в память, а затем увеличивается адрес вершина стека. Однако, стоит заметить что имеются операции загрузки и чтения данных из стека, которые не "проталкивают" данные в стеке.

Рисунок 16 - Организация стека данных FPU

Если операция записи данных осуществляется когда указатель на вершину стека равен 0, то записываемые данные окажутся в стековом регистре 7 и будет сформировано исключение "Переполнение стека", при чтении данных из пустого стека формируется исключение "Опустошение стека".

Управляющий регистр блока FPU управляет точностью вычислений и выбором метода округления результата. Кроме этого он содержит битовую маску, позволяющую управлять исключениями.

Точность вычислений задается двумя битами (8 и 9): 0 - одинарная точность, 2 - двойная точность, 3 - двойная расширенная точность.

Выбор метода округления также осуществляется с помощью двух бит (10 и 11): 0 - округлять к ближайшему, 1 - округлять к ближайшему снизу, 2 - округлять к ближайшему сверху, 3 - отбросить дробную часть.

Каждый бит битовой маски управляющего регистра соответствует определенному исключению. Установленный в 1 бит блокирует формирование исключения. Исключения формируются в следующих случаях: неточный результат, недействительная операция, деление на ноль, опустошение (слишком маленький результат), переполнение, ненормализованный операнд.

Регистр состояния показывает текущее состояние блока FPU: занят/свободен, указатель на вершину стека (номер регистра, который является вершиной стека), флаги результата сравнения и арифметических операций, флаги исключений, ошибок.

При выполнении операции сопроцессором, процессор ждет завершения этой операции. Другими словами, перед каждой командой сопроцессора ассемблером автоматически генерируется команда, проверяющая, занят сопроцессор или нет. Если сопроцессор занят, процессор переводится в состояние ожидания. Иногда программисту требуется вручную ставить команду ожидания (WAIT) после команды сопроцессора.

Регистр тега отображает содержимое каждого из 8 регистров стека (по 2 на каждый регистр): 00 - действительное ненулевое число, 01 - истинный нуль, 10 - специальные числа (неподдерживаемые, ненормализованные или бесконечные числа), 11 - отсутствие данных.

В таблице 28 приведены команды блока FPU.

Таблица 28 - Некоторые команды блока FPU

Команды передачи данных
FLD src Загрузить вещественное число в ST(0) (вершину стека) из области памяти. Область памяти может быть 32-, 64-, 80-битная.
FILD src Загрузить целое число в ST(0) из памяти. Область памяти может быть 16-, 32-, 64-битной.
FBLD src Загрузить двоично-десятичное число в ST(0) из 80-битной области памяти.
FLDZ Загрузить 0 в ST(0).
FLD1 Загрузить 0 в ST(0).
FLDPI Загрузить PI в ST(0).
FLDL2T Загрузить LOG2(10) в ST(0).
FLDTL2E Загрузить LOG2(e) в ST(0).
FLDLG2 Загрузить LG(2) в ST(0).
FLDLN2 Загрузить LN(2) в ST(0).
FST dest Запись вещественного числа из ST(0) в память. Область памяти 32-, 64- или 80-битная.
FSTP dest Запись вещественного числа из ST(0) в память. Область памяти 32-, 64- или 80-битная. При этом происходит выталкивание вершины из стека.
FBST dest Запись двоично-десятичного числа в память. Область памяти 80-битная.
FBSTP dest Запись двоично-десятичного числа в память. Область памяти 80-битная. При этом происходит выталкивание вершины из стека.
FXCH st(i) Обмен значениями вершины стека и стекового регистра i (0≤i≤7)
Команды сравнения данных
FCOM Сравнение вещественных чисел ST(0) и ST(1). Флаги устанавливаются, как при операции ST(0)-ST(1).
FCOM src Сравнение ST(0) с операндом в памяти. Операнд может быть 32- или 64-битным.
FCOMP src Сравнение вещественного числа в ST(0) с операндом с выталкиванием ST(0) из стека. Операнд может быть регистром и областью памяти.
FCOMPP Сравнение ST(0) и ST(1) с двойным выталкиванием из стека.
FICOM src Сравнение целых чисел в ST(0) с операндом. Операнд может быть 16- или 32-битным.
FICOMP src Сравнение целых чисел в ST(0) с операндом. Операнд может быть 16- или 32-битной областью памяти или регистром. При выполнении операции происходит выталкивание ST(0) из стека.
FTST Проверка ST(0) на нуль.
FUCOM ST(i) Сравнение ST(0) с ST(i) без учета порядков.
FUCOMP ST(i) Сравнение ST(0) с ST(i) без учета порядков. При выполнении операции происходит выталкивание из стека.
FUCOMPP ST(i) Сравнение ST(0) с ST(i) без учета порядков. При выполнении операции происходит двойное выталкивание из стека.
FXAM Анализ содержимого вершины стека. Результат помещается в биты С3-С0. 000 - неподдерживаемый формат. 001 - не число. 010 - нормализованное число. 011 - бесконечность. 100 - нуль. 101 - пустой операнд. 110 - ненормализованное число.
Арифметические команды
FADD src FADD ST(i),ST Сложение вещественных чисел. ST(0)<-ST(0)+src, src - 32- или 64-битное число ST(i)<-ST(i)+ST(0)
FADDP ST(i),ST Сложение вещественных чисел, ST(i)<-ST(i)+ST(0). При выполнении операции происходит выталкивание стека.
FIADD src Сложение целых чисел. ST(0)<-ST(0)+src, src - 16- или 32-битное число.
FSUB src FSUB ST(i),ST Вычитание вещественных чисел. ST(0)<-ST(0)-src, src - 32- или 64-битное число. ST(i)<-ST(i)-ST(0).
FSUBP ST(i),ST Вычитание вещественных чисел, ST(i)<-ST(i)-ST(0). При выполнении операции происходит выталкивание стека.
FSUBR ST(i),ST Обратное вычитание вещественных чисел. ST(0)<-ST(i)-ST(0)
FSUBRP ST(i),ST Обратное вычитание вещественных чисел. ST(0)<-ST(i)-ST(0). При выполнении операции происходит выталкивание стека.
FISUB src Вычитание целых чисел. ST(0)<-ST(0)-src, src - 16- или 32-битное число.
FISUBR src Вычитание целых чисел. ST(0)<-ST(0)-src, src - 16- или 32-битное число. При выполнении операции происходит выталкивание из стека.
FMUL FMUL ST(i) FMUL ST(i),ST Умножение двух операндов. В первом случае ST(0)<-ST(0)*ST(1). Во втором случае ST(0)<-ST(i)*ST(0). В третьем случае ST(i)<-ST(i)*ST(0).
FMULP ST(i),ST(0) ST(i)<-ST(i)*ST(0) умножение и выталкивание из стека.
FIMUL src Умножение ST(0) на целое число. ST(0)<-ST(0)*src. Операнд может быть 16- и 32-битным числом.
FDIV FDIV ST(i) FDIV ST(i),SY ST(0)<-ST(0)/ST(1) ST(0)<-ST(0)/ST(i) ST(i)<-ST(0)/ST(i)
FDIVP ST(i),ST Деление с выталкиванием из стека. ST(i)<-ST(0)/ST(i).
FIDIV src Деление целых чисел. ST(0)<-ST(i)/src. Делитель может быть 16- и 32-битным числом.
FDIVR ST(i),ST Обратное деление вещественных чисел. ST(0)<-ST(i)/ST(0)
FDIVRP ST(i),ST Обратное деление вещественных чисел и выталкивание из стека. ST(0)<-ST(i)/ST(0)
FIDIVR src Обратное деление целых чисел. ST(0)<-src/ST(0).
FSQRT Извлечь корень из ST(0) и поместить обратно.
FSCALE Масштабирование. ST(0)<-ST(0)*2^ST(1)
FEXTRACT Выделение мантиссы и порядка из числа ST(0). В ST(0) помещается порядок, в ST(1) - мантисса.
FPREM Нахождение остатка от деления. ST(0)<-ST(0)MODST(1).
FRNDINT Округление до ближайшего целого числа, находящегося в ST(0). ST(0)<-int(ST(0))
FABS Нахождение абсолютного значения. ST(0)<-ABS(ST(0))
FCSH Изменение знака ST(0)<- -ST(0)
Трансцендентные функции
FCOS Вычисление косинуса. ST(0)<-COS(ST(0)). Содержимое в ST(0) интерпретируется как угол в радианах.
FPTAN Частичный тангенс. Содержимое в ST(0) интерпретируется как угол в радианах. Значение тангенса возвращается на место аргумента, а затем в стек включается 1.
FPATAN Вычисление арктангенса. Вычисляется функция Arctg(ST(1)/ST(0)). После вычисления функции происходит выталкивание из стека, после чего значение функции помещается в вершину.
FSIN Вычисление синуса. ST(0)<-SIN(ST(0)). Содержимое в ST(0) интерпретируется как угол в радианах.
FSINCOS Вычисление синуса и косинуса. ST(0)<-SIN(ST(0)) и ST(1)<-COS(ST(0))
F2XM1 Вычисление 2^X-1. ST(0)<-2^ST(0)-1.
FYL2X Вычисление Y*LOG2(X). ST(0)=Y, ST(1)=X. Происходит выталкивание из стека, и только потом в вершину стека помещается результат вычисления.
FYL2XP1 Вычисление Y*LOG2(X). ST(0)=Y, ST(1)=X. Происходит выталкивание из стека, и только потом в вершину стека помещается результат вычисления.
Команды управления блоком FPU
FINIT Инициализация сопроцессора.
FSTSW АХ Запись слова состояния в АХ.
FSTSW dest Запись слова состояния в dest.
FLDCW src Загрузка управляющего слова (16 бит) из dest.
FSTCW dest Сохранение управляющего слова в dest.
FCLEX Сброс исключений.
FLDENV src Загрузка состояния оборудования из памяти.
FSAVE dest Сохранение состояния оборудования и файла регистров в памяти.
FRSTOR src Загрузка состояния оборудования и файла регистров в памяти.
FINCSTP Инкремент указателя стека.
FDECSTP Декремент указателя стека.
FFREE ST(i) Освобождение регистра - пометка ST(i) как свободного.
FNOP Холостая операция сопроцессора.
WAIT (FWAIT) Ожидание процессором завершение текущей операции сопроцессором.
         

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  




Подборка статей по вашей теме: