ПРОЦЕССОР ЧИСЕЛ С ПЛАВАЮЩЕЙ ТОЧКОЙ (FPU) Архитектура Компьютеров2011
ОСНОВНЫЕ ТЕМЫ ЛЕКЦИИ История развития сопроцессоров (FPU) Форматы чисел с плавающей точкой Программная модель сопроцессора Система команд сопроцессоров Программирование сопроцессоров на языке Ассемблера Архитектура Компьютеров2011
Сопроцессор 8087 был разработан для использования в системах с процессорами семейства 8086/88. Сопроцессор 8087 реализовывал полную поддержку числовых операций в соответствии с ранними предложениями стандарта IEEE 754 для двоичных арифметических операций с плавающей точкой. С появлением сопроцессора стали возможны ускоренные арифметические вычисления для быстродействующих многозадачных и многополь- зовательских систем на основе процессора ПРОЦЕССОР ЧИСЕЛ С ПЛАВАЮЩЕЙ ТОЧКОЙ (FPU)
Арифметические сопроцессоры 387 стали третьим поколением числовых процессоров фирмы Intel. Они реализуют последний стандарт IEEE 754, куда добавлены новые тригонометрические функции. Арифметический модуль для чисел с плавающей точкой процессора i486 является по существу встроенным в микросхему эквивалентом сопроцессора 387 DX, соответствующим как стандарту IEEE 754, так и более новому, обобщенному стандарту IEEE 854. Устройство с плавающей точкой (FPU) процессора PENTIUM реализовано совместно с целочисленным устройством на одном кристалле и использует высокий уровень конвейеризации.
Математический сопроцессор x87 выполняет операции с плавающей точкой в раз быстрее эквивалентных подпрограмм процессора x86. Программисты могут включать команды сопроцессора x87 в программы для процессора x86. Когда основной процессор встречает команду сопроцессора, он передает ее для выполнения этому сопроцессору x87. Возникает иллюзия того, что процессор x86 может выполнять команды с плавающей точкой.
При отсутствии сопроцессора x87 основной процессор x86, обнаружив команду сопро- цессора, передает управление подпрограмме обработки особого случая, указанной операционной системой. Фирма INTEL поставляет подпрограмму Е80x87, которая программно эмулирует действия сопроцессора x87. Эта подпрограмма создает иллюзию наличия в системе сопроцессора x87, но операции с плавающей точкой выполняются в раз медленнее.
ФОРМАТЫ ЧИСЕЛ С ЛАВАЮЩЕЙ ТОЧКОЙ Сопроцессор х87 распознает три формата чисел с плавающей точкой, хранимых в памяти. Каждый формат состоит из трех полей: Знак числа (S), Порядок и Мантисса : S8 бит23 бита ПорядокМантисса Одинарная точность (Короткое вещественное) 4 Байта S11 бит52 бита Двойная точность (Длинное вещественное) 8 Байт S15 бит64 бита Расширенная точность (Временное вещественное) 10 Байт
Байт с наименьшим адресом в памяти является младшим байтом мантиссы. Байт с наибольшим адресом содержит семь старших бит порядка и бит знака (S). В ПОЛЕ МАНТИССЫ хранятся только нормализованные числа. Для этого порядки необходимо скорректировать так, чтобы в целой части числа (в двоичной системе счисления) до запятой была 1. Поэтому все мантиссы больше 1 и меньше 2. Но если старший бит всегда содержит 1, ее можно не хранить в каждом числе с плавающей точкой. Поэтому ради дополнительного бита точности сопроцессор х87 хранит числа одинарной и двойной точности без старшего бита мантиссы (с неявным старшим битом). Числа с расширенной точностью хранятся и обрабатываются с явным старшим битом.
ПОЛЕ ПОРЯДКА определяет степень числа 2, на которую нужно умножить нормализованную мантиссу для получения значения числа с плавающей точкой. Чтобы хранить отрицательные порядки, в ПОЛЕ ПОРЯДКА находится сумма истинного порядка и положительной константы, называемой СМЕЩЕ- НИЕМ. Двоичный код смещения для всех порядков равен : 0111…111. Числа в поле порядка: и – зарезервированы для СПЕЦКОДИРОВАНИЯ или обработки ошибок.
Наименьшее отрицательное Наибольшее отрицательное Наибольшее положительное Наименьшее положительное Одинарная точность Двойная точность Расширенная точность
ФОРМАТЫ ЦЕЛЫХ ЧИСЕЛ Сопроцессор х87 имеет команды, которые преобразуют целые числа в числа с плавающей точкой и – наоборот. Это необходимо при вычислениях, в которых имеются числа обоих форматов. Целое число Дополнительный код 16 бит, 2 байта Короткое целое Дополнительный код 32 бита, 4 байта Длинное целое Дополнительный код 64 бита, 8 байт Упакованное десятичное 18 десятичных тетрад S бит72 бита 10 байт
При выполнении арифметических операций над числами с плавающей точкой иногда возникают ошибочные условия или ОСОБЫЕ СЛУЧАИ: НЕДЕЙСТВИТЕЛЬНАЯ ОПЕРАЦИЯ – включает в себя, например, деление и умножение с операндами бесконечность и нуль, извлечение корня квадратного из отрицательного числа, попытку использовать несуществующий регистр сопроцессора х87 или др. ДЕНОРМАЛИЗОВАННЫЙ ОПЕРАНД – возникает, когда ради увеличения диапазона приходится жертвовать точностью. ДЕЛЕНИЕ НА НУЛЬ – дает в результате бесконечность. Наличие у сопроцессора х87 двух нулей очевидным образом приводит к знаковым бесконечностям: x / (+0) = +, -x / (+0) = -, x / (-0) = -, -x / (-0) = +.
НЕТОЧНЫЙ РЕЗУЛЬТАТ – возникает, когда результат операции невозможно точно представить в формате приемника. Например, при делении 1.0 на 3.0 получается бесконечная дробь, которую невозможно точно представить ни в одном формате. 0 округление к ближайшему числу 0 округление в направлении к нулю 0 округление к положительной бесконечности 0 округление к отрицательной бесконечности
РЕГИСТРЫ СОПРОЦЕССОРА х87 Операнды команд сопроцессора х87 могут находиться в памяти или в одном из восьми ЧИСЛЕННЫХ РЕГИСТРОВ. Эти регистры хранят числа преимущественно в формате расширенной точности. Обращение к операндам в регистрах осуществляется намного быстрее, чем к операндам в памяти. Номер численного регистра, указанного в команде, сопроцессор всегда суммирует с содержимым поля TOP (или ST – вершина стека) в регистре состояния. Сумма (берущаяся по модулю 8) определяет используемый численный регистр, т. е. регистры адресуются внутри сопроцессора, как СТЕК.
АДРЕСАЦИЯ ЧИСЛЕННЫХ РЕГИСТРОВ КАК СТЕКА R0Третий от вершиныST(3) R1ST(4) R2ST(5) R3ST(6) TOPR4Седьмой от вершиныST(7) 101R5ВершинаST(0) R6Первый от вершиныST(1) R7Второй от вершиныST(2)
Регистр состояния (Status Word) Младшие 6 бит содержат ФЛАГИ ОСОБЫХ СЛУЧАЕВ: · IE - недействительная операция, · DE - денормализованный операнд, · ZE - деление на нуль, · OE - переполнение, · UE - антипереполнение, · PE - точность (неточный результат). Биты С0,С1,С2,С3 содержат КОДЫ УСЛОВИЙ, являющи- еся результатом сравнения или команды нахождения остатка. Поле ВЕРШИНЫ СТЕКА – TOP (Stack Top) – содержит номер регистра, являющегося верхним элементом стека. Его содержимое прибавляется (по модулю 8) ко всем номерам численных регистров BC3TOPC2C1C0ESSFPEUEOEZEDEIE
Регистр управления (Control Word) Младшие 6 битов отведены для МАСОК ОСОБЫХ СЛУЧАЕВ: IM - маска недействительной операции, DM - маска денормализованного операнда, ZM - маска деления на нуль, OM - маска переполнения, UM - маска антипереполнения, PM - маска точности (неточного результата). Два бита поля УПРАВЛЕНИЯ ТОЧНОСТЬЮ – РС – заставляют сопроцессор x87 округлять все числа перед загрузкой их в численные регистры (в стек) до указанной точности. Два бита поля УПРАВЛЕНИЯ ОКРУГЛЕНИЕМ – RC – выбирают один из четырех режимов округления ICRCPCPMUMOMZMDMIM
Регистр тэгов (признаков) 16-ти битовый РЕГИСТР ТЭГОВ состоит из 8-ми двухбитовых полей. Каждое поле соответствует своему численному регистру и индицирует состояние регистра: 00 - действительное число (т.е. любое конечное ненулевое число), 01 - нуль, 10 - недействительное число (например, нечисло или бесконечность), 11 - пустой регистр Тэг 7Тэг 6Тэг 5Тэг 4Тэг 3Тэг 2Тэг 1Тэг 0
КОМАНДЫ СОПРОЦЕССОРА х87 (FPU) Форматы команд сопроцессора х87 аналогичны форматам команд х86. Ассемблерные мнемоники команд сопроцессора начинаются с буквы F (Floating) и их легко обнаружить, т.к. таких мнемоник у процессора х86 нет. Вторая буква I (Integer) обозначает операцию с целым двоичным числом из памяти, буква B (Binari-coded decimal) - операцию с десятичным операндом из памяти, а вторая "пустая" буква определяет операцию с вещественными числами. Предпоследняя или последняя буква R указывает обратную операцию (для вычитания и деления). Последняя буква P (Pop) идентифицирует команду, заключительным действием которой является извлечение из стека.
Численные регистры адресуются относительно верши- ны стека. Например, команда: FADD ST(0),ST(3) прибавляет содержимое третьего регистра от вершины стека к содержимому верхнего регистра стека. Верхний регистр стека можно обозначить ST или ST(0). Например, команда: FADD ST,ST(0) прибавляет содержимое верхнего регистра стека к нему же, т.е. удваивает содержимое регистра ST(0). Для операндов в памяти допускаются все режимы адресации процессора х86, например: FADD [BX] FADD ANAME [BX] [SI] В командах FPU никогда НЕ ИСПОЛЬЗУЕТСЯ НЕПОСРЕДСТВЕННАЯ АДРЕСАЦИЯ операндов.
КОМАНДЫ ПЕРЕДАЧИ ДАННЫХ Команды включения в стек FLD, FILD, FBLD и все команды включения констант – сначала уменьшают указатель стека на 1, преобразуют операнд-источник в расширенный формат (если он уже не представлен в таком формате) и помещают его в новую вершину стека. Мнемоники команд с целочисленным (двоичным) операндом начинаются с "FI", а с десятичным операндом - с "FB". Команды извлечения из стека преобразуют содержимое вершины стека в необходимый формат, помещают его в операнд-приемник (память или регистр) и после этого инкрементируют указатель стека. Команды копирования делают то же самое, но не изменяют указатель стека.
Мнемоника, Операнд Тип команды С плав. точкой Целое число Десят. число FLD FSTP FST FXCH FILD FISTP FIST FBLD FBSTP (–) Включить в стек Извлечь из стека (+) Копирование Обмен регистров FLDZ FLD1 FLDPI FLDLG2 FLDLN2 FLDL2T FLDL2E (–) Включить в стек 0 (–) Включить в стек 1 (–) Включить в стек 3,1415… (–) Включить в стек log 10 (2) (–) Включить в стек log e (2) (–) Включить в стек log 2 (10) (–) Включить в стек log 2 (e)
АРИФМЕТИЧЕСКИЕ КОМАНДЫ Базовые арифметические команды – сложение (FADD), вычитание (FSUB), умножение (FMUL) и деление (FDIV) – имеют два операнда (источник и приемник) и реализуют действия: ПРИЕМНИК ПРИЕМНИК $ ИСТОЧНИК, где $ - основные команды : +, –, *, /. Для некоммутативных команд вычитания и деления имеются обратные варианты команд (в конце мнемоники добавляется буква R – revers): ПРИЕМНИК ИСТОЧНИК $ ПРИЕМНИК. Во всех командах один операнд должен быть В ВЕРШИНЕ СТЕКА.
6 форм арифметических команд FSUB mem, FISUB mem - адресуемый операнд в памяти является источником, а регистр вершины стека ST(0) - приемником. Преобразование в расширенный формат с плавающей точкой осуществляется в процессе выполнения команды. УКАЗАТЕЛЬ СТЕКА НЕ МОДИФИЦИРУЕТСЯ. FSUB ST(0), ST(i) - любой численный регистр ST(i) служит источником, а ST(0) - приемником. УКАЗАТЕЛЬ СТЕКА НЕ МОДИФИЦИРУЕТСЯ. FSUB ST(i), ST(0) - вершина стека является источни- ком, а ST(i) - приемником. УКАЗАТЕЛЬ СТЕКА НЕ МОДИФИЦИРУЕТСЯ.
FSUBP ST(i), ST - вершина стека является источником, а ST(i) - приемником. По окончании операции источник ST(0) извлекается из стека с последующим ИНКРЕМЕНТОМ УКАЗАТЕЛЯ СТЕКА. FSUB ( FSUBP ST(1),ST(0) ) - извлекает из вершины стека источник (потом инкрементирует указатель стека), затем извлекает приемник (еще раз инкрементирует указатель стека), выполняет операцию и перед включением результата в стек декрементирует указатель. В итоге - ВЕРШИНА СТЕКА СДВИНУЛАСЬ В СТОРОНУ УВЕЛИЧЕНИЯ. Последняя форма является частным случаем предыдущей. STxST(0) yST(1)ST y - xST(0) zz
ДОПОЛНИТЕЛЬНЫЕ АРИФМЕТИЧЕСКИЕ КОМАНДЫ Эти команды без явных операндов выполняют действия над содержимым вершины стека, результат помещают туда же БЕЗ МОДИФИКАЦИИ УКАЗАТЕЛЯ СТЕКА. FABS – нахождение абсолютной величины. FCHS – изменение знака операнда. FRNDINT – округление операнда до целого в формате с плавающей точкой. FSQRT – извлечение квадратного корня. FPREM – вычисляет остаток от деления содержимого ST(0) на число из ST(1). Остаток замещает число в ST(0). FSCALE – масштабирование на степень числа 2 – прибавляет целое число из ST(1) к порядку в регистре ST(0), т.е. умножает (или делит) ST(0) на число 2 ST(1). Эту команду можно использовать для возведения числа 2 в целую степень (положительную или отрицательную).
КОМАНДЫ СРАВНЕНИЙ FCOM ST(i)/mem - сравнивает содержимое ST(0) с операн- дом "x" (в численном регистре или в памяти), т.е. производит вычитание операндов без запоминания результата и устанавливает коды условий в регистре состояния FICOM mem – сравнивает содержимое вершины стека ST(0) с целым числом в памяти. FCOMP ST(i)/mem – аналогична команде FCOM, но после сравнения производит извлечение операнда из вершины стека. FCOMPP ST(i) – сравнивает ST(0) c ST(i) и извлекает из стека оба операнда. FTST – сравнивает вершину стека с НУЛЕМ. FXAM – сравнивает вершину стека с НУЛЕМ, но выставляет 4 флага условий (в частности, определяется ненормализованная мантисса, бесконечность, нечисло и др.).
FCOMI ST(0),ST(i) – сравнение вещественных чисел и установка флагов в EFLAGS (P6+). FCOMIР ST(0),ST(i) – сравнение вещественных чисел и установка флагов в EFLAGS и извлечение операнда из вершины стека (P6+). Флаги условий (С0, С3) сопроцессора х87 используются для организации условных переходов микропроцессором х86. Для этого командой – FSTSW AX – содержимое регистра состояния х87 копируется в аккумулятор АХ микропроцессора х86. После этого командой – SAHF – старший байт аккумулятора (АН) передается в младший байт регистра флагов. При этом условию С0 соответствует флаг СF, а условию С3 - флаг ZF. C3C0 Условие 00 ST(0) > x 01 ST(0) < x 10 ST(0) = x 11 ST(0) и x – не сравнимы
К элементарным трансцендентным функциям относятся: тригонометрические функции (sin, cos, tg и др.), обратные тригонометрические функции (arcsin, arctg и др.), логарифмические функции (log 2 (x), log 10 (x), log e (x)), показательные функции (x y, 2 x, 10 x, e x ), гиперболические функции (sh, ch, th и др.), обратные гиперболические функции (arsh, arch, arth и др.). Сопроцессор х87 вычисляет любую из элементарных трансцендентных функций от аргументов двойной точности, давая результат двойной точности с ошибкой младшего разряда округления. Аргументы трансцендентных команд должны быть нормализованными. ТРАНСЦЕНДЕНТНЫЕ КОМАНДЫ
МнемоникаОписание командыВычисляемая функция FPTANЧастичный тангенсST(1) / ST(0) = tg (ST(0)) FSINСинус(387+)ST(0) = sin (ST(0)) FCOSКосинус (387+)ST(0) = cos (ST(0)) FSINCOSСинус, косинус (387+)ST(7)=sin(ST(0)); ST(0)=cos(ST(0)) FPATANЧастичный арктангенсST(0) = arctg (ST(1)/ST(0) FYL2XДвоичный логарифмST(0) = ST(1) * log 2 (ST(0)) FYL2XP1Двоичный логарифм ST(0) = ST(1) * log 2 (ST(0)+1) F2XM1Показательная функцияST(0) = 2 (ST(0)) – 1
КОМАНДЫ УПРАВЛЕНИЯ СОПРОЦЕССОРОМ Команды управления сопроцессором х87 обеспечивают доступ к нечисловым регистрам. Мнемоники, которые начинаются с FN, соответствуют командам "БЕЗ ОЖИДАНИЯ", т.е. процессор х86 передает их для выполнения в сопроцессор, не проверяя занятость сопроцессора и игнорируя численные особые случаи. Мнемоники без буквы "N" соответствуют командам "С ОЖИДАНИЕМ", т.е. заставляют процессор х86 реагировать на незамаскированные особые случаи и ожидать завершения выполнения команд в сопроцессоре.
Команда – FNSTCW mem (FSTCW mem) – передает содержимое регистра управления (CW) в ячейку памяти. Команда – FLDCW mem – загружает регистр управления (CW) из ячейки памяти. Эти две команды применяются для изменения режима работы сопроцессора х87. Команда – FNSTSW mem (FSTSW mem) – передает содержимое регистра состояния (SW) сопроцессора х87 в ячейку памяти. Команда – FNSTSW AX (FSTSW AX) – передает содержимое регистра состояния (SW) сопроцессора в регистр AX микропроцессора х86.
Команда – FNCLEX (FCLEX) – сбрасывает в регистре состояния сопроцессора флаги особых случаев, а также биты ES и BUSY. Эти флаги не сбрасываются аппаратно и должны явно сбрасываться программистом. Команда – FNINIT (FINIT) – инициализирует регистры управления, состояния и тэгов. Такое же действие производит аппаратный сигнал сброса – RESET. Команда FFREE ST(i) устанавливает тэг регистра ST(i) на указатель "пустой".
ПРАКТИЧЕСКИЕ ЗАДАНИЯ ПО ПРОГРАММИРОВАНИЮ FPU Задание 1. Вычислить значение функции : void main ( ) { long A=20; long B=30; float ALPHA=0.7; long M2=2; float RES; __asm { finit fldALFA fsin fimulA fimulB fidivM2 fstpRes }
Задание 2. Вычислить значение функции: void main ( ) { long A=20; long B=30; long C=40; long M2=2; float RES; __asm { finit fildA fildB fildC fldST(0) p C B A
faddST(0),ST(2) faddST(0),ST(3) fidivM2 fsubrST(1),ST(0) fsubrST(2),ST(0) fsubrST(3),ST(0) fmul; fmulp ST(1),ST(0) fsqrt fstpRes } p C (p – C) B (p – B) A (p – A)
Задание 4. Возведение основания 2 в произвольную степень. Фрагмент программы : В вершине стека находится аргумент «z»; допустим, z = 5,7. Результат (2 z ) помещается в вершину стека. fld ST(0); Копирование вершины стека frndint; Округление до целого : ST(0) = 6 fsub ST(1),ST(0) ; Выделение дробной части ST(1) = -0,3 fxch f2xm1; Возведение 2 в дробную степень ST(0) = 2 -0,3 - 1 fld1 fadd; Добавление единицы fscale; Возведение 2 в целую степень ST(0) = 2 6* 2 -0,3 ; и умножение fstp ST(1); Удаление и сдвиг вершины ; Результат в вершине стека ST(0) = 2 5,7 2 5,7 = 2 6 * 2 -0,3
Задание 5. Перевести число 75,625 в формат одинарной точности с плавающей точкой. Переводим отдельно целую и дробную часть в двоичный код: 75 = В0,625 = 0,101 В , ,50 2 1, 0 Полученное число приводим к нормализованному виду : ,101 В = 1, * Прибавляем к порядку смещение : Записываем число в формате с плавающей точкой : = h
Вопросы для экспресс-контроля Форматы данных сопроцессора. Программная модель сопроцессора. Адресация регистров. Особые случаи сопроцессора и их маскирование. Кодирование мнемоник сопроцессора.
Лекция окончена СПАСИБО ЗА ВНИМАНИЕ