Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
Системне програмування
ЛАБОРАТОРНА РОБОТА № 4
ПРОГРАМУВАННЯ СПІВПРОЦЕСОРА З ВИКОРИСТАННЯМ КОМАНД ОБЧИСЛЕННЯ ТРАНСЦЕНДЕНТНИХ ФУНКЦІЙ ТА РЕАЛІЗАЦІЯ РОЗГАЛУЖЕНЬ ПРИ ПОРІВНЯННІ ДАНИХ ДІЙСНОГО ТИПУ
Львів 2012
Мета: познайомитися з принципами роботи математичного співпроцесора і використати його можливості для обчислення трансцендентних функцій та реалізації розгалужень.
Теоретичні відомості
Команди порівняння чисел
У центральному процесорі команди умовних переходів виконуються відповідно до значень окремих бітів регістра прапорців процесора. У арифметичному співпроцесорі існують спеціальні команди порівнянь, за наслідками виконання яких, встановлюються біти кодів умов в регістрі стану:
FCOM - Порівняння
FICOM - Цілочисельне порівняння
FCOMP - Порівняння і вилучення зі стеку ST(0)
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) Ініціалізувати співпроцесор (ініціалізує регістр стану, регістр управління, і регістр тегів таким чином:
Регістр управління - Проектна нескінченість, округлення до найближчого, розширена точність, всі особливі випадки замасковані
Регістр стану - B=0 (біт зайнятості скинутий), код умови не визначений, ST=ES=0, прапорці особливих випадків встановлені в нуль
Регістр тегів - Всі поля регістра тегів містять значення 11 (порожній регістр)).
FNSTENV (FSTENV) Записати оточення (записує в пам’ять вміст всіх регістрів, окрім числових, у визначеному форматі. Команда корисна при обробці особливих випадків).
FLDENV Завантажити оточення (завантажує регістри, збережені командою FNSTENV).
FNSAVE (FSAVE) Записати повний стан (діє аналогічно команді FNSTENV, але додатково зберігає вміст числових регістрів).
FRSTOR Відновити повний стан (діє аналогічно команді FLDENV, але додатково відновлює вміст числових регістрів).
FINCSTP Збільшити покажчик стека SP на 1
FDECSTP Зменшити покажчик стека SP на 1
FFREE Звільнити регістр (визначає числовий регістр ST, вказаний як операнд, як порожній, записуючи у відповідне поле регістра тегів значення 11).
FNOP Пуста команда, немає операції (не робить жодних дій).
FSETPM Встановлює захищений режим роботи (переводить співпроцесор в захищений режим роботи).
Хід виконання:
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу.Вхідні дані повинні вводитися з клавіатури, під час виконання програми в десятковому форматі зі знаком. Програма повинна складатися з двох модулів:головний модуль – створюється мовою С і має забезпечити ввід необхідних даних, виклик асемблерної процедури для обчислення виразу та вивід результату обчислень;модуль безпосередніх обчислень – здійснює всі необхідні арифметичні дії з використанням математичного співпроцесора;
Переконатися у правильності роботи кожного модуля зокрема та програми загалом.
Варіант 17
main.cpp
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <conio.h>
using namespace std;
extern "C" void calc(void);
extern "C"
{
float a=0;
float c1=0;
float d=0;
float X=0;
};
int main()
{
float Y;
cout<<"Please, enter a:\n";
cout<<"a = ";
cin>>a;
cout<<"Please, enter c:\n";
cout<<"c = ";
cin>>c1;
cout<<"Please, enter d:\n";
cout<<"d = ";
cin>>d;
if (c1>d)
{
Y=(2*c1-log(a+d)*c1)/(c1/4-1);
}
else
{
Y=(41-d/4-1)/(c1/tan(d+a)-d);
}
calc();
cout<<"X = "<<X;
cout<<"\nperevirochne X = "<<Y;
getch();
return 0;
}
calc.asm
.586
.model flat,C
.data
EXTRN a:DWORD, c1:DWORD, d:DWORD, X:DWORD
.data
tmp dd 0
tmp1 dd 0
tmp2 dd 0
tmp3 dd 0
.code
calc PROC
finit
fld c1
fcomp d
fstsw ax
sahf
ja ___ob2
;чисельник
mov tmp, 4
fld d
fild tmp
fdiv
fst tmp
mov tmp1, 41
fild tmp1
fld tmp
fsub
fst tmp1
fld tmp1
mov tmp2, 1
fild tmp2
fsub
fst tmp
;знаменник
fld d
fld a
fadd
fptan
fdiv
fst tmp1
fld c1
fld tmp1
fdiv
fst tmp2
fld tmp2
fld d
fsub
fst tmp1
fld tmp
fld tmp1
fdiv
jmp ___fin
___ob2:
;чисельник
mov tmp, 2
fild tmp
fld c1
fmul
fst tmp
fld a
fld d
fadd
fld1
fsub
fst tmp1
fld1
fld tmp1
fyl2x
fldln2
fmul
fst tmp1
fld tmp1
fld c1
fmul
fst tmp1
fld tmp
fld tmp1
fsub
fst tmp
;знаменник
mov tmp1, 4
fld c1
fild tmp1
fdiv
fld1
fsub
fst tmp1
fld tmp
fld tmp1
fdiv
___fin:
fstp X
ret
calc endp
end
Результат виконання програми:
c>d
/
c<d
/
Висновок: виконавши дану лабораторну роботу, я познайомитися з принципами роботи математичного співпроцесора і використала його можливості для обчислення трансцендентних функцій та реалізації розгалужень.