МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
ЗВІТ
до лабораторної роботи № 3
з дисципліни
" Системне програмування"
Львів – 2012
Тема: ВИКОРИСТАННЯ МАТЕМАТИЧНОГО СПІВПРОЦЕСОРА.
Мета: познайомитися з принципами роботи математичного співпроцесора і використати його можливості для обчислення арифметичних виразів.
ЗАВДАННЯ
1. Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу.
Вхідні дані повинні вводитися з клавіатури, під час виконання програми в десятковому форматі зі знаком.
Програма повинна складатися з двох модулів:
головний модуль – створюється мовою С і має забезпечити ввід необхідних даних, виклик асемблерної процедури для обчислення виразу та вивід результату обчислень;
модуль безпосередніх обчислень – здійснює всі необхідні арифметичні дії з використанням математичного співпроцесора;
2. Переконатися у правильності роботи кожного модуля зокрема та програми загалом.
3. Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
4. Дати відповідь на контрольні запитання.
ВАРІАНТИ ЗАВДАНЬ
А, В, С, D, E, F - знакові операнди, довжиною в байтах, згідно з індексу, значення К подано у 16-му форматі.
29
X=K-B1*C1+D3-F2/E1
12A0C029
Код програми:
Main.cpp
#include<stdio.h>
#include<conio.h>
extern "C" int calc(int B, int C, int D, int E, int F); //опис параметрів ф-ції
int main()
{
int B=0;
int C=0;
int D=0;
int E=0;
int F=0;
int X;
int K=312524841;
printf("X=(K-(B*C))+(D-(F/E)) k=12A0C029 hex = 312524841 dec\n");
printf("Please, enter your numbers:\n");
printf("B = ");
scanf("%d",&B);
printf("C = ");
scanf("%d",&C);
printf("D = ");
scanf("%d",&D);
printf("E = ");
scanf("%d",&E);
printf("F = ");
scanf("%d",&F);
printf("\nC++: Result = %d\n",(K-(B*C))+(D-(F/E))); // вивід с++ результату
X = calc(B,C,D,E,F); //виклик файлу асм
printf("asm=X = %d\n",X); //вивід асм результату
getch();
return 0;
}
Calc.asm
.586
.model flat,c
.data Bfl dd 0
Cfl dd 0
Ffl dd 0
Dfl dd 0
Efl dd 0
D1 dd 0
D2 dd 0
tmp dd 0
.code
calc PROC
;X=(K-(B*C))+(D-(F/E)) k=12A0C029 hex = 312524841 dec
push ebp
mov ebp,esp
mov eax,[ebp+8]
mov Bfl,eax
mov eax,[ebp+12]
mov Cfl,eax
mov eax,[ebp+16] ; <- зчитування чисел з клавіатури і збереження їх в змінні Bfl,Cfl,Dfl,Efl,Ffl
mov Dfl, eax
mov eax,[ebp+20]
mov Efl,eax
mov eax,[ebp+24]
mov Ffl,eax
fild Bfl
fild Cfl
fmul
mov tmp,312524841
fild tmp
fsubr
fistp D1
fild Ffl
fild Efl
fdiv
fild Dfl
fsubr
fistp D2
fild D1 ;завантаження до співпроцесора D1
fild D2 ;завантаження до співпроцесора D2
fadd
fistp tmp ;збереження результату в змінну tmp, вилучаючи зі стеку
mov eax,tmp ;занесення значення змінної tmp в регістр еах, для виводу в С++
pop ebp
ret
calc ENDP
END
Результат виконання:
Висновок:
Я ОВОЛОДІВ НАВИКАМИ СТВОРЕННЯ ПРОГРАМ, ЧАСТИНИ ЯКИХ НАПИСАНІ РІЗНИМИ МОВАМИ ПРОГРАМУВАННЯ ЗАСВОЇВ ПРАВИЛА ВЗАЄМОДІЇ РІЗНИХ МОДУЛІВ.