Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
ЗВІТ
до лабораторної роботи № 4
з дисципліни
" Системне програмування"
Львів – 2012
Тема: ПРОГРАМУВАННЯ СПІВПРОЦЕСОРА З ВИКОРИСТАННЯМ КОМАНД ОБЧИСЛЕННЯ ТРАНСЦЕНДЕНТНИХ ФУНКЦІЙ ТА РЕАЛІЗАЦІЯ РОЗГАЛУЖЕНЬ ПРИ ПОРІВНЯННІ ДАНИХ ДІЙСНОГО ТИПУ.
Мета: познайомитися з принципами роботи математичного співпроцесора і використати його можливості для обчислення трансцендентних функцій та реалізації розгалужень.
ЗАВДАННЯ
1. Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу.
Вхідні дані повинні вводитися з клавіатури, під час виконання програми в десятковому форматі зі знаком.
Програма повинна складатися з двох модулів:
головний модуль – створюється мовою С і має забезпечити ввід необхідних даних, виклик асемблерної процедури для обчислення виразу та вивід результату обчислень;
модуль безпосередніх обчислень – здійснює всі необхідні арифметичні дії з використанням математичного співпроцесора;
2.Переконатися у правильності роботи кожного модуля зокрема та програми загалом.
3.Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
4.Дати відповідь на контрольні запитання.
ВАРІАНТИ ЗАВДАНЬ
Код програми:
Main.cpp
#include <stdio.h>
#include <math.h>
extern "C" float calc(float A,float C, float D);
extern "C"
{
float A = 0;
float C = 0;
float D = 0;
};
int main()
{
printf("if C > D -((lg(25+(2*A))/D)/(C+A-1)\n");
printf("if C <= D -((C+23)-(D+4)/(A-ln(A+(C/D)))\n");
printf("A = ");scanf_s("%f",&A);
printf("C = ");scanf_s("%f",&C);
printf("D = ");scanf_s("%f",&D);
printf("asm: X = %f\n", calc(A,C,D)); // виклик файлу асм, ф-ції
if (C> D)
printf("c++: X = %f\n", ((log10(25+(2*A))/D))/(C+A-1));
else
printf("c++: X = %f\n", (((C+23)-(D+4))/(A-log(A+(C/D)))));
getchar();getchar();
return 0;
}
Calc.asm
.386
.model flat, c
.data ;опис змінних
Afl dd 0
Cfl dd 0
Dfl dd 0
tmp dd 0
tmp1 dd 0
.code
calc proc
push ebp
mov ebp, esp
mov eax,[ebp+8]
mov Afl,eax
mov eax,[ebp+12]
mov Cfl,eax
mov eax,[ebp+16]
mov Dfl, eax
fld Cfl
fcomp Dfl
fstsw ax
sahf
jbe var2
var1:
(log10(25+(2*A))/D)
fld Afl
mov tmp,2
fild tmp
fmul
mov tmp,25
fild tmp
fadd
fstp tmp
fld1
fld tmp
fyl2x
fldl2t
fdivp ST (1),ST (0)
fld Dfl
fdiv
fld Cfl
fld Afl
fadd
fld1
fsub
fdiv ;ділення: ((log10(25+(2*A))/D)) на (C+A-1)
jmp next
var2:
fld Cfl
fld Dfl
fdiv
fld Afl
fadd
fistp tmp
fild tmp
fld1
fldl2e
fdivp
fild tmp
fyl2x
fld Afl
fsubr
;((C+23)-(D+4)))
fld Cfl
mov tmp,23
fild tmp
fadd ;Cfl + 23
fld Dfl
mov tmp,4
fild tmp
fadd
fsub ;((C+23)-(D+4))) віднімання
fdivr ; ділення: ((C+23)-(D+4))) / (A-ln(A+(C/D))
next:
pop ebp
ret
calc ENDP
END
Результат виконання:
Висновок:
Я оволодів навиками створення програм, частини яких написані різними мовами програмування Засвоїв правила взаємодії різних модулів.
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!