МІНІСТЕРСТВО ОСВІТИ І НАУКИ, УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
Звіт
про виконання лабораторної роботи № 3
з курсу „ Системне програмування”
ВИКОРИСТАННЯ МАТЕМАТИЧНОГО СПІВПРОЦЕСОРА
Мета: познайомитися з принципами роботи математичного співпроцесора і використати його можливості для обчислення арифметичних виразів.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Математичний співпроцесор запускається центральним процесором. Після запуску він виконує всі обрахунки самостійно і паралельно з роботою центрального процесора. Якщо центральний процесор направляє наступну команду співпроцесору в той момент, коли співпроцесор ще не закінчив виконання попередньої команди, центральний процесор переводиться в стан очікування. Якщо ж співпроцесор не зайнятий, центральний процесор, направивши команду співпроцесору, продовжує свою роботу, не очікуючи завершення обрахунку. Послідовне розташування команд співпроцесора і центрального процесора в коді програми створюють ілюзію послідовного їх виконання. Простіше кажучи можлива така ситуація, що коли центральний процесор звернеться до комірки пам’яті, куди арифметичний співпроцесор повинен був записати результат своїх обчислень і якщо співпроцесор ще не закінчив обрахунки то результату там не буде. Однак є спеціальні засоби синхронізації (команда FWAIT).
Префікс команд та адресація операндів
Команди які призначенні для виконання співпроцесором, записуються в програмі як звичайні машинні команди центрального процесора, але всі вони починаються з байта, який відповідає команді центрального процесора ESC. Зустрівши таку команду, процесор передає її співпроцесору, а сам продовжує виконання програми з наступної команди.
Асемблерна мнемоніка всіх команд співпроцесора починається з букви F, наприклад: FADD, FDIV, FSUB и так далі. Команди співпроцесора можуть адресувати операнди, аналогічно звичайним командам центрального процесора. Операндами можуть бути або дані, які розміщуються в основній пам’яті комп’ютера, або внутрішні регістри співпроцесора.
Для команд арифметичного співпроцесора можливі всі види адресації даних, які використовуються центральним процесором.
Формати даних
Математичний співпроцесор може обробляти дані в форматі з плаваючою комою і цілі числа.
Дійсні числа. В загальному вигляді дійсні числа в загальних обрахунках можна записати наступним чином:
(знак)(мантиса)*10(знак)(порядок)
Наприклад: -1.35*105 (мінус одна ціла тридцять п’ять сотих, помножені на десять в п’ятому степені).
Тут знак: мінус, мантиса: 1.35, порядок: 5. Порядок теж може мати знак.
Важливим є таке поняття, як нормалізоване представлення чисел: якщо ціла частина мантиси числа складається з однієї цифри, не рівної нулю, то число з плаваючою крапкою називається нормалізованим. Перевага використання нормалізованих чисел полягає в тому, що для фіксованої розрядної сітки числа (тобто для фіксованої кількості цифр в числі) нормалізовані числа мають найбільшу точність. Крім того, нормалізоване представлення виключає неоднозначність, яка може виникнути через те, що кожне число з плаваючою крапкою може бути представлене різними (ненормалізованими) способами (наприклад: 123.5678*10^5 = 12.35678*10^6 = 1.235678*10^7 = 0.1235678*10^8 ).
При програмуванні на мовах високого рівня зустрічається наступне представлення чисел з плаваючою крапкою:
(знак)(мантиса)E(знак)(порядок)
Наприклад, -5.35E-2 означає число -5.35*10-2 (мінус п’ять цілих тридцять п’ять сотих, помножені на десять в мінус другому ступені).
Арифметичний співпроцесор може працювати з дійсними числами в трьох форматах:
- одинарної точності (4 байти)
- подвійної точності (8 байт)
- розширеної точності (10 байт)
При будь-якому представленні. старший біт визначає знак дійсного числа: 0 - додатне число, 1 – від’ємне число. Всі числа, рівні по модулю, відрізняються лише цим бітом, оскільки для представлення від’ємних чисел доповняльний код не використовується, на відміну від центрального процесора.
Арифметичний співпроцесор працює з нормалізованими двійковими числами. Двійкове число з плаваючою крапкою називається нормалізованим, якщо ціла частина мантиси рівна 1. З метою розширення розрядної сітки, ця одиниця не зберігається у форматах одинарної і подвійної точності. У форматі з розширеною точністю зберігається і "зайвий" біт цілої частини нормалізованого числа. Основна причина використання для обчислень розширеної точності - оберігання програми від можливої втрати точності обчислень, пов’язаної з великими відмінностями в порядках чисел, що беруть участь в арифметичних операціях.
Поле порядку - це степінь числа 2, на який множиться мантиса, плюс зсув, рівний 127 для одинарної точності, 1023 - для подвійної точності і 16383 - для розширеної точності.
Для того, щоб визначити абсолютне значення числа з плаваючою крапкою, можна скористатися наступними формулами:
- Одинарна точність: 1.(цифри мантиси)*2Р-127
- Подвійна точність: 1.(цифри мантиси)* 2Р-1023
- Розширена точність: 1.(цифри мантиси)* 2Р-16383
Знак числа визначається старшим бітом.
Наприклад:
Маємо таке число представлено з одинарною точністю:
Для цього числа знаковий біт рівний 1 (від’ємне число), порядок рівний 126, мантиса - 11 (у двійковій системі числення).
Значення цього числа рівне:
1.11 * 2(126-127)= -1.75 * 2^-1 = -0,875
Цілі числа. Арифметичний співпроцесор разом з дійсними числами здатний обробляти і цілі числа. Він має команди, що виконують перетворення цілих чисел в дійсні і назад.
Можливий чотири формати цілих чисел:
- ціле число;
- коротке ціле число;
- довге ціле число;
-упаковане двійково-десяткове число.
Ціле число займає два байти. Його формат повністю відповідає формату, що використовується центральним процесором. Для представлення від’ємних чисел використовується доповняльний код.
Коротке ціле і довге ціле мають аналогічні формати, але займають, відповідно, 4 і 8 байт.
Упаковане двійково-десяткове число займає 10 байт. Це число містить 18 десяткових цифр, розташованих по дві в кожному байті. Знак упакованого BCD числа знаходиться в старшому біті найлівішого байта. Решта біт старшого байта повинна бути рівні 0.
Існують команди співпроцесора, які перетворюють числа у формат упакованих двійково-десяткових чисел з внутрішнього представлення в розширеному дійсному форматі. Якщо програма робить спробу перетворення в упакований формат ненормалізованих чисел, нечисел, нескінченності і т.ін., в результаті виходить невизначеність. Невизначеність в упакованому BCD форматі є числом, в якому два старші байти містять одиниці у всіх розрядах. Вміст решти восьми байтів довільний. При спробі використовувати таке упаковане число в операціях - фіксується помилка.
main.cpp
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
extern "C" int calc(char a, short b, char c, int d, short e);
extern "C" const int K;
int main()
{//X=A1*(B2+C1)-D4/E2+K 45694
int a,b,c,d,e;
cout << "X=A1*(B2+C1)-D4/E2+K (K=45694h).\n";
cout << "Please, enter your numbers:\n";
cout << "A1 = ";
cin >> a;
cout << "B2 = ";
cin >> b;
cout << "C1 = ";
cin >> c;
cout << "D4 = ";
cin >> d;
cout << "E2 = ";
cin >> e;
cout << endl << "Result(asm) = " << calc(a,b,c,d,e);
cout << endl << "Result(c++) = " << a*(b+c)-d/e+K;
getch();
return 0;
}
//calc.asm//
.386
.model flat
public _K
.data
_K dd 45694h
x dd 0
.code
_calc proc ;X=A1*(B2+C1)-D4/E2+K 45694
public _calc
push ebp
mov ebp,esp
mov eax, [ebp+8]
mov ebx, [ebp+12]
add ebx, [ebp+16]
mul bx
mov ebx, eax
mov eax, [ebp+20]
mov ecx, [ebp+24]
div cx
sub ebx, eax
mov eax, ebx
add eax, _K
pop ebp
ret
_calc endp
END
/
Висновок: на даній лабораторній роботі я використав можливості математичного процесора у обчисленні виразів.