Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
Системне програмування
ЛАБОРАТОРНА РОБОТА № 3
ВИКОРИСТАННЯ МАТЕМАТИЧНОГО СПІВПРОЦЕСОРА
Львів 2012
Мета: познайомитися з принципами роботи математичного співпроцесора і використати його можливості для обчислення арифметичних виразів.
Теоретичні відомості
Математичний співпроцесор запускається центральним процесором. Після запуску він виконує всі обрахунки самостійно і паралельно з роботою центрального процесора. Якщо центральний процесор направляє наступну команду співпроцесору в той момент, коли співпроцесор ще не закінчив виконання попередньої команди, центральний процесор переводиться в стан очікування. Якщо ж співпроцесор не зайнятий, центральний процесор, направивши команду співпроцесору, продовжує свою роботу, не очікуючи завершення обрахунку. Послідовне розташування команд співпроцесора і центрального процесора в коді програми створюють ілюзію послідовного їх виконання. Простіше кажучи можлива така ситуація, що коли центральний процесор звернеться до комірки пам’яті, куди арифметичний співпроцесор повинен був записати результат своїх обчислень і якщо співпроцесор ще не закінчив обрахунки то результату там не буде. Однак є спеціальні засоби синхронізації (команда FWAIT).
Префікс команд та адресація операндів
Команди які призначенні для виконання співпроцесором, записуються в програмі як звичайні машинні команди центрального процесора, але всі вони починаються з байта, який відповідає команді центрального процесора ESC. Зустрівши таку команду, процесор передає її співпроцесору, а сам продовжує виконання програми з наступної команди.
Асемблерна мнемоніка всіх команд співпроцесора починається з букви F, наприклад: FADD, FDIV, FSUB и так далі. Команди співпроцесора можуть адресувати операнди, аналогічно звичайним командам центрального процесора. Операндами можуть бути або дані, які розміщуються в основній пам’яті комп’ютера, або внутрішні регістри співпроцесора.
Для команд арифметичного співпроцесора можливі всі види адресації даних, які використовуються центральним процесором.
Формати даних
Математичний співпроцесор може обробляти дані в форматі з плаваючою комою і цілі числа.
Дійсні числа. В загальному вигляді дійсні числа в загальних обрахунках можна записати наступним чином:
(знак)(мантиса)*10(знак)(порядок)
Важливим є таке поняття, як нормалізоване представлення чисел: якщо ціла частина мантиси числа складається з однієї цифри, не рівної нулю, то число з плаваючою крапкою називається нормалізованим. Перевага використання нормалізованих чисел полягає в тому, що для фіксованої розрядної сітки числа (тобто для фіксованої кількості цифр в числі) нормалізовані числа мають найбільшу точність.
При програмуванні на мовах високого рівня зустрічається наступне представлення чисел з плаваючою крапкою:
(знак)(мантиса)E(знак)(порядок)
Арифметичний співпроцесор може працювати з дійсними числами в трьох форматах:
- одинарної точності (4 байти)
- подвійної точності (8 байт)
- розширеної точності (10 байт)
При будь-якому представленні. старший біт визначає знак дійсного числа: 0 - додатне число, 1 – від’ємне число. Всі числа, рівні по модулю, відрізняються лише цим бітом, оскільки для представлення від’ємних чисел доповняльний код не використовується, на відміну від центрального процесора.
Арифметичний співпроцесор працює з нормалізованими двійковими числами. Двійкове число з плаваючою крапкою називається нормалізованим, якщо ціла частина мантиси рівна 1. З метою розширення розрядної сітки, ця одиниця не зберігається у форматах одинарної і подвійної точності. У форматі з розширеною точністю зберігається і "зайвий" біт цілої частини нормалізованого числа. Основна причина використання для обчислень розширеної точності - оберігання програми від можливої втрати точності обчислень, пов’язаної з великими відмінностями в порядках чисел, що беруть участь в арифметичних операціях.
Для того, щоб визначити абсолютне значення числа з плаваючою крапкою, можна скористатися наступними формулами:
- Одинарна точність: 1.(цифри мантиси)*2Р-127
- Подвійна точність: 1.(цифри мантиси)* 2Р-1023
- Розширена точність: 1.(цифри мантиси)* 2Р-16383
Знак числа визначається старшим бітом.
Цілі числа. Арифметичний співпроцесор разом з дійсними числами здатний обробляти і цілі числа. Він має команди, що виконують перетворення цілих чисел в дійсні і назад.
Можливий чотири формати цілих чисел:
- ціле число;
- коротке ціле число;
- довге ціле число;
-упаковане двійково-десяткове число.
Ціле число займає два байти. Його формат повністю відповідає формату, що використовується центральним процесором. Для представлення від’ємних чисел використовується доповняльний код.
Коротке ціле і довге ціле мають аналогічні формати, але займають, відповідно, 4 і 8 байт.
Упаковане двійково-десяткове число займає 10 байт. Це число містить 18 десяткових цифр, розташованих по дві в кожному байті. Знак упакованого BCD числа знаходиться в старшому біті найлівішого байта. Решта біт старшого байта повинна бути рівні 0.
Існують команди співпроцесора, які перетворюють числа у формат упакованих двійково-десяткових чисел з внутрішнього представлення в розширеному дійсному форматі.
Арифметичні команди математичного співпроцесора
Співпроцесор використовує шість основних типів арифметичних команд:
Fxxx
Перший операнд береться з вершини стека (джерело), другий - наступний елемент стека. Результат виконання команди записується в стек
Fxxx пам’ять
Джерело береться з пам’яті, приймачем є вершина стека ST(0). Покажчик стека ST не змінюється, команда дійсна тільки для операндів з одинарною і подвійною точністю
Fixxx пам’ять
Аналогічно попередньому типу команди, але операндами можуть бути 16- або 32-розрядні цілі числа
Fxxx ST, ST(i)
Для цього типу регістр ST(i) є джерелом, а ST(0) - верхівка стека - приймачем. Покажчик стека не змінюється
Fxxx ST(i), ST
Для цього типу регістр ST(0) є джерелом, а ST(i) - приймачем. Покажчик стека не змінюється
FXXXP ST(i), ST
Регістр ST(i) - приймач, регістр ST(0) - джерело. Після виконання команди джерело ST(0) витягується із стека
Рядок "xxx" може приймати наступні значення:
ADD - Додавання
SUB - Віднімання
SUBR - Зворотне віднімання, тобто операнди міняються місцями
MUL - Множення
DIV - Ділення
DIVR - Зворотне ділення, ділене і дільник міняються місцями
Окрім основних арифметичних команд є додаткові арифметичні команди:
FSQRT - Знаходження квадратного кореня
FSCALE – Масштабування на ступінь числа 2
FPREM - Обчислення часткової остачі
FRNDINT - Округлення до цілого
FXTRACT - Виділення порядку числа і мантиси
FABS – Знаходження абсолютного значення (модуля) числа
FCHS - Зміна знаку числа
Хід виконання:
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу.Вхідні дані повинні вводитися з клавіатури, під час виконання програми в десятковому форматі зі знаком. Програма повинна складатися з двох модулів:головний модуль – створюється мовою С і має забезпечити ввід необхідних даних, виклик асемблерної процедури для обчислення виразу та вивід результату обчислень;модуль безпосередніх обчислень – здійснює всі необхідні арифметичні дії з використанням математичного співпроцесора;
Переконатися у правильності роботи кожного модуля зокрема та програми загалом.
Варіант 17
X=A4-K+C4/D2-E1*F1
К=1017
main.cpp
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
extern "C" void calc(void);
extern "C"
{
float A=0;
float C1=0;
float D=0;
float E=0;
float F=0;
float X=0;
};
int main()
{
int K=1017;
float Z=0;
cout<<"A = ";
cin>>A;
cout<<"C = ";
cin>>C1;
cout<<"D = ";
cin>>D;
cout<<"E = ";
cin>>E;
cout<<"F = ";
cin>>F;
Z= A-K+C1/D-E*F;
cout<<"Perevirka na pravelnist = ";
printf("%.4f",Z);
cout<<endl;
calc();
printf("X = %.4f\n",X);
return 0;
}
lab3.asm
.386
.model flat,c
EXTRN A:SDWORD,C1:SDWORD,D:SDWORD,E:SDWORD,F:SDWORD,X:SDWORD
.data
afl dd 0
cfl dd 0
dfl dd 0
efl dd 0
ffl dd 0
K dd 1017
temp1 dd 0
temp2 dd 0
temp3 dd 0
temp4 dd 0
;X=A4-K+C4/D2-E1*F1
.code
calc PROC
mov eax,A
mov afl,eax
fld afl
fild K
fsub
fst temp1
mov eax,C1
mov cfl,eax
mov eax,D
mov dfl,eax
fld cfl
fld dfl
fdiv
fst temp2
fld temp1
fld temp2
fadd
fst temp3
mov eax,E
mov efl,eax
mov eax,F
mov ffl,eax
fld efl
fld ffl
fmul
fst temp4
fld temp3
fld temp4
fsub
fst X
ret
calc ENDP
END
Результат виконання програми:
/
Висновок: виконавши дану лабораторну роботу, я познайомилася з принципами роботи математичного співпроцесора і використала його можливості для обчислення арифметичних виразів.