Міністерство освіти, науки, молоді та спорту України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Звіт
до лабораторної роботи №3
на тему: «Використання математичного співпроцесора»
з предмету: «Системне програмування»
Підготувала:
ст.гр. КІ-33
Надолинська Ольга
Перевірив:
Олексів М.В.
Львів 2012
Мета: познайомитися з принципами роботи математичного співпроцесора і використати його можливості для обчислення арифметичних виразів.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Математичний співпроцесор запускається центральним процесором. Після запуску він виконує всі обрахунки самостійно і паралельно з роботою центрального процесора. Якщо центральний процесор направляє наступну команду співпроцесору в той момент, коли співпроцесор ще не закінчив виконання попередньої команди, центральний процесор переводиться в стан очікування. Якщо ж співпроцесор не зайнятий, центральний процесор, направивши команду співпроцесору, продовжує свою роботу, не очікуючи завершення обрахунку. Послідовне розташування команд співпроцесора і центрального процесора в коді програми створюють ілюзію послідовного їх виконання. Простіше кажучи можлива така ситуація, що коли центральний процесор звернеться до комірки пам’яті, куди арифметичний співпроцесор повинен був записати результат своїх обчислень і якщо співпроцесор ще не закінчив обрахунки то результату там не буде. Однак є спеціальні засоби синхронізації (команда FWAIT).
Префікс команд та адресація операндів
Асемблерна мнемоніка всіх команд співпроцесора починається з букви F, наприклад: FADD, FDIV, FSUB и так далі. Команди співпроцесора можуть адресувати операнди, аналогічно звичайним командам центрального процесора
Основні команди математичного співпроцесора
Команда
Функція
Операнд 1
Операнд 2
Результат
Команди пересилки даних
FLD
Завантажити відправник (змінна дійсного типу) до стеку (регістр ST(0))
відправник
–
ST(0)
FILD
Завантажити відправник (змінна цілого типу) до стеку (регістр ST(0))
відправник
–
ST(0)
FST
Копіювати значення зі стеку (регістр ST(0)) до приймача (змінна дійсного типу)
приймач
–
приймач
FSTP
Перенести значення зі стеку (регістр ST(0)) до приймача (змінна дійсного типу)
приймач
–
приймач
FIST
Копіювати значення зі стеку (регістр ST(0)) до приймача (змінна цілого типу)
приймач
–
приймач
FISTP
Перенести значення зі стеку (регістр ST(0)) до приймача (змінна цілого типу)
приймач
–
приймач
FXCH
Обмін значеннями регістрів ST(0) та відправника (інший регістр)
відправник
–
–
FCMOVxx
Група команд умовної пересилки даних
приймач
відправник
ST(0)
Група команд умовної пересилки даних FCMOVxx
Команда
Реальна умова
Умова для команди FCOM
FCMOVE
ZF = 1
Якщо рівні
FCMOVNE
ZF = 0
Якщо нерівні
FCMOVB
CF = 1
Якщо менше
FCMOVBE
CF = 1 та ZF = 1
Якщо менше або рівні
FCMOVNB
CF = 0
Якщо не менше
FCMOVNBE
CF = 0 та ZF = 0
Якщо не менше або рівні
Основні команди математичного співпроцесора
Команди управління FPU
FINIT
Ініціювання роботи математичного співпроцесора FPU
–
–
–
FSTCW
Копіювання вмісту регістру CR до приймача (змінна розміром 2 байта або регістр загального призначення)
приймач
–
змінна
FLDCW
Копіювання відправника (змінна розміром 2 байта) до регістру CR
відправник
–
CR
FSTSW
Копіювання вмісту регістру SR до приймача (змінна розміром 2 байта або регістр AX)
приймач
–
змінна або AX
Арифметичні команди математичного співпроцесора
Співпроцесор використовує шість основних типів арифметичних команд:
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 - Зміна знаку числа
Варіант:
21
X=A4/B2+C1*(D2 – E1+K)
21
Код програми:
Calc.asm
.586
.model flat,c
.data
K dd 33; 21h
tmp dd 0
.code
calc PROC
public calc
push ebp
mov ebp,esp
fld dword ptr[ebp+8]
fdiv dword ptr[ebp+12]
fstp tmp
fld dword ptr[ebp+16]
fsub dword ptr[ebp+20]
fild K
fadd
fmul dword ptr[ebp+24]
fld tmp
fadd
pop ebp
ret
calc ENDP
END
Main.cpp
#include <stdio.h>
#include <conio.h>
extern "C" float calc(float A,float B,float D,float E,float C);
void main()
{
float A,B,D,E,C,K=33;
double X=0;
printf("Enter data\n");
printf("A = ");
scanf("%f",&A);
printf("B = ");
scanf("%f",&B);
printf("D = ");
scanf("%f",&D);
printf("E = ");
scanf("%f",&E);
printf("C = ");
scanf("%f",&C);
X=calc(A,B,D,E,C);
printf("asm: X = %f\n",X);
X=A/B+C*(D-E+K);
printf("C: X = %f\n",X);
getch();
}
Результати виконання програми:
Висновок: під час виконання даної лабораторної роботи Я познайомилася з принципами роботи математичного співпроцесора і використала його можливості для обчислення арифметичних виразів. Написала програму згідно свого варіанта, та підготувала звіт з результатами виконання програми.