Міністерство освіти і науки
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Звіт
з лабораторної роботи № 3
з дисципліни: “Системне програмування”
на тему: “Використання математичного співпроцесора”
Мета лабораторної роботи
Ознайомитися з принципами роботи математичного співпроцесора і використати його можливості для обчислення арифметичних виразів з числами з плаваючою комою.
Теоретичні відомості
Математичний співпроцесор запускається центральним процесором. Після запуску він виконує всі обрахунки самостійно і паралельно з роботою центрального процесора. Якщо центральний процесор направляє наступну команду співпроцесору в той момент, коли співпроцесор ще не закінчив виконання попередньої команди, центральний процесор переводиться в стан очікування. Якщо ж співпроцесор не зайнятий, центральний процесор, направивши команду співпроцесору, продовжує свою роботу, не очікуючи завершення обрахунку. Послідовне розташування команд співпроцесора і центрального процесора в коді програми створюють ілюзію послідовного їх виконання. Простіше кажучи можлива така ситуація, що коли центральний процесор звернеться до комірки пам’яті, куди арифметичний співпроцесор повинен був записати результат своїх обчислень і якщо співпроцесор ще не закінчив обрахунки то результату там не буде. Однак є спеціальні засоби синхронізації (команда FWAIT), що дозволять центральному процесорові дочекатися результатів роботи співпроцесора.
Індивідуальне завдання
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу. Вхідні дані повинні вводитися з клавіатури, під час виконання програми, як дійсні числа зі знаком. Програма повинна складатися з двох модулів:
головний модуль – створюється мовою С і має забезпечити ввід необхідних даних, виклик асемблерної процедури для обчислення виразу та вивід результату обчислень;
модуль безпосередніх обчислень – здійснює всі необхідні арифметичні дії з використанням математичного співпроцесора.
Переконатися у правильності роботи кожного модуля зокрема та програми загалом.
Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
Дати відповідь на контрольні запитання.
29.
X=K-B1*C1+D2-F2/E1
12A0C029
А, В, С, D, E, F - дійсні числа, де індекс визнає точність внутрішнього подання (1 – одинарної, 2 – подвійної точності). Константу К подано у 16-му форматі.
Код програми
main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <conio.h>
extern "C" double calc(float, float, double, float, double);
extern "C" const double K = 0x12A0C029;
void main()
{
printf("X = %.0lf - B * C + D - F / E\n\n", K);
float B, C, E;
double D, F;
printf("B = ");
scanf("%f", &B);
printf("C = ");
scanf("%f", &C);
printf("D = ");
scanf("%lf", &D);
printf("E = ");
scanf("%f", &E);
printf("F = ");
scanf("%lf", &F);
printf("\nC: X = %lf\nAsm: X = %lf\n", K - B * C + D - F / E, calc(B, C, D, E, F));
_getch();
}
calc.asm
.686
.model flat, c
.data
extrn K : qword
.code
calc proc
push ebp
mov ebp, esp
fld dword ptr [ebp+8] ; ST(0) = B
fmul dword ptr [ebp+12] ; ST(0) = B * C
fsubr K ; ST(0) = K - B * C
fadd qword ptr [ebp+16] ; ST(0) = K - B * C + D
fld qword ptr [ebp+28] ; ST(0) = F | ST(1) = K - B * C + D
fdiv dword ptr [ebp+24] ; ST(0) = F / E | ST(1) = K - B * C + D
fsub ; ST(0) = K - B * C + D - F / E
pop ebp
ret
calc endp
end
Результат виконання програми
/
/
/
Висновок
Я оволодів навичками створення програм, частини яких написані різними мовами програмування та засвоїв правила взаємодії між програними модулями різних мов програмування.