
- •Завдання на лабораторну роботу
- •Теоретичні відомості
- •32-Бітний формат чисел з плаваючою комою
- •64-Бітний формат чисел з плаваючою комою
- •80-Бітний формат чисел з плаваючою комою
- •Система команд математичного співпроцесора
- •Система команд співпроцесора Intel 8087 Команди передачі даних
- •Команди порівняння даних
- •Арифметичні команди
- •Трансцендентні функції
- •Команди управління співпроцесором
- •Реалізація функцій через команди співпроцесора
- •Програми, використані для роботи
- •Стандартні функції
- •Правила звернення до функції виведення printf
- •Функція вводу scanf
- •Приклад лабораторної роботи для функції lg(X)
Завдання на лабораторну роботу
Розрахувати функцію, задану варіантом, двома методами:
з використанням математичного співпроцесора.
з допомогою виклику стандартних функцій.
Візуально порівняти отримані результати.
Варіант визначається якXYY, деX–номер групи,YY–номер в списку.
N = XYY mod 5
N |
Функція |
0 |
Sin(x) |
1 |
Cos(x) |
2 |
Arccos(x) |
3 |
Arcsin(x) |
4 |
Arctg(x) |
5 |
Exp(x) |
6 |
Ln(x) |
7 |
Sh(x) |
8 |
Ch(x) |
9 |
Tg(x) |
Теоретичні відомості
В якості запам'ятовуючого пристрою в співпроцесора використовується 8 80-розрядних регістрів, організованих в структуру на зразок стека.
Типи даних, які розпізнаються співпроцесором
Усередині FPU числа зберігаються в 80-бітному форматі з плаваючою комою, для запису або читання з пам'яті можуть використовуватися:
• один з трьох форматів з плаваючою точкою (32, 64 і 80 біт),
• цілочисельні формати (16, 32 і 64 біта),
• 80-бітний BCD-формат.
32-Бітний формат чисел з плаваючою комою
31 30 23 22 0
+---+---------+-------------+
| S|E7 ...E0|M1M2 ...M23|
+---+---------+-------------+
Біт S - знак, біти E - зміщений порядок (8 біт), M - мантиса (23 біта).
Порядок називають зміщеним бо справжній порядок дорівнює E-127. Число E зберігається у вигляді невід'ємного числа в прямому коді.
• Для звичайних чисел допустимими значеннями порядку є все, крім 0 і 255.
• Якщо E = 0, то число чи є машинним нулем (+0 або -0), або є денормалізованним.
• Якщо E = 255, число являє + inf або-inf або NaN.
Мантиса являє собою дробову частину цієї мантиси (тобто, кома знаходиться зліва від M1). Якщо число нормалізоване (E не 0), то мається на увазі ціла частина M0 = 1. Для денормалізованних чисел (E = 0) мається на увазі M0 = 0.
Тобто, звичайні числа обчислюються за формулою:
N = (-1) ^ S * 2 ^ (E-127) * (1.M)
Наприклад:
+1.0 0 01111111 00000000000000000000000 (або 3F800000h)
+2.0 0 10000000 00000000000000000000000
-2.0 1 10000000 00000000000000000000000
Числа з плаваючою комою зберігаються в пам'яті у форматі Little endian, тобто молодші байти йдуть першими. Наприклад, число +1.0 буде зберігатися в пам'яті як:
00 00 80 3F
64-Бітний формат чисел з плаваючою комою
63 62 52 51 0
+---+-------------+-------------------+
| S|E7 ...E0|M1M2 ...M52|
+---+-------------+-------------------+
Цей формат повністю аналогічний попередньому, тільки порядок зміщений на 1023.
80-Бітний формат чисел з плаваючою комою
79 78 64 63 0
+---+---------------+-------------------------+
| S|E7 ...E0|M0M1 Ь2 ...M52|
+---+---------------+-------------------------+
Цей формат має дві відмінності:
• порядок зміщений на 16383;
• в мантиссу безпосередньо включений біт цілої частини M0. Він дорівнює 0 тільки для денормалізованних чисел, та1 у всіх інших випадках.
Система команд математичного співпроцесора
Структура
стека і регістрів управління та стану
співпроцесора Intel 8087, емулятор якого ми
будемо використовувати в даній роботі,
має наступний вигляд:
У мові Асемблера є спеціальна група команд, яка генерує коди співпроцесора і організує його взаємодію з головним процесором. Назви цих команд починаються з літери F, а наступні літери визначають тип операції.
Наприклад, всі команди завантаження і перетворень містять в мнемоніці букви ld і виконуються шляхом розміщення даних з плаваючою точкою в верхівку стека з попереднім зміною поточного значення покажчика стека st і перетворенням у внутрішню десятибайтну форму з плаваючою крапкою. Основна команда fld пересилає дані як з регістрів з плаваючою крапкою, що задаються у формі st [i], де i - номер необхідного регістра щодо верхівки стека, так і з будь-якої області головної пам'яті і задається за форматом:
[Мітка:] fld операнд-джерело
Команди fild і fbld задаються програмістом для перетворення цілочисельних даних в форму з плаваючою крапкою при завантаженні чотирьох-, восьми-і десятибайтних даних в співпроцесор з пам'яті. Буква i задає цілочисельні двійкові дані, буква b - десятибайтні двійково-десяткові дані в bcd-коді. Команди fst і fist задають копіювання вмісту верхівки стека st [0] з перетвореннями в формат, що відповідає визначенню області приймача. Команди вилучення з стека і перетворень даних: fstp, fistp і fbstp після перетворення даних звільняють відповідний регістр стека і зміщують покажчик стека. Команда fxch задає обмін регістра верхівки стека st [0] з регістром, заданим в операнді. Група безоперандних команд використовується для завантаження поширених констант в верхівку стека fldz - 0, fld1 - 1, fldpi - п, fldlg2 - lg 2, fldln2 - ln 2, fldl2t-log2 10, fldl2e - log2 e.
Якщо проміжні результати обчислення функцій поміщені в області пам'яті f1 і f2, то фрагмент програми для підсумовування даних має вигляд:
fld f1; Завантаження першого доданка
fld f2; Завантаження другого доданка
fadd; Підсумовування з вивільненнямстекаспівпроцесора
fstp result; Запам'ятовування результату в пам'яті
Слід запам'ятати:
• кількість елементів в стеку співпроцесора обмежена (максимум 8);
• стек «кільцевий»;
• при поміщенніданих у стек, TOP зменшується на 1 і даніпоміщуютьсяв нову вершину стека;
• при виштовхуванні даних з стека, дані зчитуються з вершини і TOP збільшується на 1;
• числа можуть бути завантажені тільки на вершину стека;
• вилучатись може тільки вершина стека.