Professional Documents
Culture Documents
Лабораторна робота 2 5в
Лабораторна робота 2 5в
Лабораторна робота №2
з дисципліни: " Системне програмування "
на тему
«Опрацювання даних в математичному співпроцесорі та обчислення
елементарних функцій»
Виконав:
ст.гр. КІ-
Перевіри
в
Львів 2022
Мета: ознайомитися з принципами роботи математичного співпроцесора і
використати його можливості для обчислення арифметичних виразів з даними
дійсного типу.
Завдання
Програма на x32:
Main.cpp
#include <stdio.h>
#include <math.h>
extern "C" double calc(double, float, float);
int main()
{
double x = 0;
double a = 0;
float c = 0;
float d = 0;
float asm_res = 0;
printf("Enter numbers:\n");
printf("A = ");
scanf_s("%lf", &a);
printf("C = ");
scanf_s("%f", &c);
printf("D = ");
scanf_s("%f", &d);
if (c <= d)
printf("\nc<=d, (4*c+d-1) / (c-tan(a/2) = %lf\n", ((4 * c + d - 1) / (c -
tan(a / 2))));
else if (c>d)
printf("\nc>d, (2*c-d/23) / (log(1-a/4)) = %lf\n", ((2 * c - d / 23) /
(log(1 - a / 4))));
asm_res = calc(a, c, d);
printf("\nResult of function calc is: %f\n", asm_res);
return 0;
}
Calc.asm:
.686
.model flat, c
.data
const_1 dd 1.00
const_2 dd 2.00
const_3 dd 3.00
const_4 dd 4.00
const_23 dd 23.00
.code
public calc
calc PROC
push ebp
mov ebp, esp
finit
c_lower:
;(4*c+d-1) / (c-tan(a/2)
jmp stop
c_bigger:
;(2*c-d/23) / (log(1-a/4))
jmp stop
stop:
pop ebp
ret
calc ENDP
END
.code
public calc
calc PROC
finit
c_lower:
;(4*c+d-1) / (c-tan(a/2)
jmp stop
c_bigger:
;(2*c-d/23) / (log(1-a/4))
jmp stop
stop:
fst qword ptr[rsp+8] ;-> from FPU to addr
movlps xmm0, qword ptr[rsp+8] ;-> to lower 8 bytes of xmm0 (01 00)
ret
calc ENDP
END