Міністерство освіти і науки
Національний університет «Львівська політехніка»
Кафедра ЕОМ
Звіт
до лабораторної роботи № 4
з дисципліни: “Системне програмування”
на тему: Обчислення елементарних функцій на
математичному співпроцесорі
ОБЧИСЛЕННЯ ЕЛЕМЕНТАРНИХ ФУНКЦІЙ НА
МАТЕМАТИЧНОМУ СПІВПРОЦЕСОРІ
Мета: познайомитися з принципами роботи математичного співпроцесора та
оволодіти навиками використання вбудованих елементарних математичних
функцій та реалізації розгалужень.
ТЕОРИТИЧНІ ВІДОМОСТІ:
Команди порівняння чисел
У центральному процесорі команди умовних переходів виконуються
відповідно до значень окремих бітів регістра прапорців процесора. У
арифметичному співпроцесорі існують спеціальні команди порівнянь, за
наслідками виконання яких, встановлюються біти кодів умов в регістрі стану:
FCOM – порівняння;
FICOM – порівняння цілих чисел;
FCOMP - порівняння дійсних чисел і вилучення зі стеку;
FICOMP - порівняння цілих чисел і вилучення зі стеку;
FCOMPP - порівняння і подвійне вилучення зі стеку (ST(0), ST(1));
FTST - порівняння операнда з нулем;
FXAM - аналіз операнда на тип числа (скінчене число, денормалізоване
число, нуль, некінечність, ...).
Трансцендентні команди
Трансцендентні команди призначені для обчислення наступних функцій:
тригонометричні (sin, cos, tg...)
зворотні тригонометричні (arcsin, arccos...)
показникові (xy , 2x , 10x , ex )
гіперболічні (sh, ch, th...)
зворотні гіперболічні (arsh, arch, arcth...)
Ось список всіх трансцендентних команд математичного співпроцесора:
FPTAN - обчислення часткового тангенса;
FPATAN - обчислення часткового арктангенса;
FYL2X - обчислення y*log2(x);
FYL2XP1 - обчислення y*log2(x+1);
F2XM1 - обчислення 2x-1;
FCOS - обчислення cos(x);
FSIN - обчислення sin(x);
FSINCOS - обчислення sin(x) і cos(x) одночасно.
Команди керування
Команди, керування, призначені для роботи з нечисловими регістрами
співпроцесора. Деякі команди мають альтернативні варіанти. Мнемоніки цих
команд можуть починатися з FN або F. Перший варіант відповідає командам
“Без очікування”. Для таких команд процесор не перевіряє, чи зайнятий
співпроцесор виконанням команди, тобто біт зайнятості B не перевіряється.
Особливі випадки також ігноруються.
Варіанти команд “З очікуванням” діють так само, як і звичайні команди
співпроцесора.
Ось список команд керування для співпроцесора:
FNSTCW (FSTCW) - записати управляюче слово (записує вміст регістра
управління в оперативну пам’ять).
FLDCW - завантажити управляюче слово (завантажує регістр управління
з оперативної пам’яті і, як правило, використовується для зміни режиму роботи
співпроцесора).
FNSTSW (FSTSW) - записати слово стану (записує вміст регістра стану в
оперативну пам’ять).
FNSTSW AX (FSTSW AX) - записати слово стану в AX (записує вміст
регістра стану в регістр AX центрального процесора, де можливий аналіз
вмісту за допомогою команд умовних переходів).
FNCLEX (FCLEX) - скинути особливі випадки (скидає прапорці
особливих випадків в регістрі стану співпроцесора, також скидаються біти ES і
B).
FNINIT (FINIT) - ініціалізувати співпроцесор (ініціалізує регістр стану,
регістр управління, і регістр тегів таким чином:
регістр управління - проектна нескінченість, округлення до найближчого,
розширена точність, всі особливі випадки замасковані;
ЗАВДАННЯ
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом
виразу. Вхідні дані повинні вводитися з клавіатури, як дійсні числа.
Програма повинна складатися з двох модулів:
головний модуль – створюється мовою С і має забезпечити ввід необхідних
даних, виклик асемблерної процедури для обчислення виразу та вивід
результату обчислень;
модуль безпосередніх обчислень – здійснює всі необхідні арифметичні дії з
використанням математичного співпроцесора.
Переконатися у правильності роботи кожного модуля зокрема та програми загалом.
Скласти звіт про виконану роботу з приведенням тексту програми та
коментарів до неї.
Дати відповідь на контрольні запитання.
ВАРІАНТИ ЗАВДАННЯ:
Варіант
Завдання
19
Примітка: ai – елементи масиву дійсних чисел подвійної точності; c та
d - дійсні числа одинарної точності.
КОД ПРОГРАМИ:
Файл(main.cpp)
#include <cmath>
#include <iostream>
#define SIZE 4
using namespace std;
extern "C" float calc(float, float, double);
void main()
{
double a[SIZE];
float c, d;
double x;
cout << "Enter a (4 elements): ";
for (int i = 0; i < SIZE; i++)
cin >> a[i];
cout << "Enter c: "; cin >> c;
cout << "Enter d: "; cin >> d;
for (int i = 1; i < SIZE+1; i++)
{
if (c > d)
x = (2 * c - d + sqrt(23 * a[i])) / (a[i] / 4 - 1);
else
x = (c + 4 * d - sqrt(123 * c)) / (1 - a[i] / 2);
cout << "\n\tResult" << i << endl;
cout << "Result in C: " << x << endl;
cout << "Result in ASM: " << calc(c, d, a[i]) << endl;
}
}
Файл(calc.asm)
.586
.model flat, c
.data
const_1 dd 1
const_2 dd 2
const_4 dd 4
const_23 dd 23
const_123 dd 123
.code
calc PROC
push ebp
mov ebp, esp
;--------------------
finit
fld dword ptr[ebp+8] ;завантаження c
fcom dword ptr[ebp+12] ;порівняння з d
fstsw ax ;формування прапорців
sahf
ja __more ;якщо c>d переходимо на _more
;---------------------------------(при c <= d)
fld dword ptr[ebp+12] ;завантаження d
fimul const_4
fadd
fld dword ptr[ebp+8] ;завантаження c
fimul const_123
fsqrt ;обчислення кореня Ст(0)
fsub
;обчислення знаменника
fild const_1
fld qword ptr[ebp+16] ;завантаження а
fidiv const_2
fsub
fdiv ;ділення чисельника на знаменник
jmp __end
;---------------------------------(при c > d)
__more:
fimul const_2
fsub dword ptr[ebp+12] ;віднімання d
fld qword ptr[ebp+16] ;завантаження a
fimul const_23
fsqrt ;знайти корінь від Ст(0)
fadd
;обчислення знаменника
fld qword ptr[ebp+16] ;завантаження а
fidiv const_4
fisub const_1
fdiv ;ділення чисельника на знаменник
__end:
;--------------------
pop ebp
ret
calc ENDP
END
РЕЗУЛЬТАТ ВИКОНАННЯ:
Рис.1 Вміст консолі після виконання команди
ВИСНОВОК:
На даній лабораторній роботі вивчив принципи роботи математичного співпроцесора, навчився використовувати вбудовані елементарні математичні функції та реалізовувати розгалуження. Також результат виконання асемблерного модуля порівнюю з результатом отриманим засобами мови С я отримав одинакові результати, що свідчить про коректність результату.