Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
/
Лабораторна робота №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 – від’ємне. Числа, що рівні за модулем, відрізняються лише цим бітом, оскільки для представлення від’ємних чисел доповняльний код не використовується, на відміну від центрального процесора.
Завдання
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу. Вхідні дані повинні вводитися з клавіатури, під час виконання програми в десятковому форматі зі знаком. Програма повинна складатися з двох модулів:
головний модуль – створюється мовою С і має забезпечити ввід необхідних даних, виклик асемблерної процедури для обчислення виразу та вивід результату обчислень;
модуль безпосередніх обчислень – здійснює всі необхідні арифметичні дії з використанням математичного співпроцесора;
Переконатися у правильності роботи кожного модуля зокрема та програми загалом.
Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
Дати відповідь на контрольні запитання.
Варіант завдання:
А, В, С, D, E, F - знакові операнди, довжиною в байтах, згідно з індексу,
значення К подано у 16-му форматі.
/
Лістинг програми:
Модуль С
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
extern"C" float calc();
extern"C"
{
float A, B, C_, D, E;
};
int main()
{
printf("A=");
scanf_s("%f", &A);
printf("B=");
scanf_s("%f", &B);
printf("\nC=");
scanf_s("%f", &C_);
printf("\nD=");
scanf_s("%f", &D);
printf("\nE=");
scanf_s("%f", &E);
calc();
printf("Result=%f", calc());
return 0;
}
Модуль С
#include <stdio.h>
extern "C" void Printf(float value) {
printf("Result ASM = %f\n", value);
return;
}
Модуль ASM
.586
.model flat,c
Printf PROTO near C : dword
EXTRN A:SDWORD, B:SDWORD,C_:SDWORD,D:SDWORD,E:SDWORD
PUBLIC calc
.data
K dd 29h
temp1 dd 0
temp2 dd 0
;X=(K-B-C)*D+E/F
.code
calc PROC
push ebp
mov ebp,esp
fld E
fadd K
fdivr D
fld A
fmul C_
fsub
fld A
fmul B
fadd
fst temp2
fld temp2
invoke Printf, temp2
pop ebp
ret
calc ENDP
END
Результати виконання програми:
/
Рис. 1 Вікно з результатом виконаної програми
Висновок: на даній лабораторній роботі я ознайомився з принципами роботи математичного співпроцесора і використав його можливості для обчислення арифметичних виразів з числами з плаваючою комою.