You are on page 1of 6

Міністерство освіти і науки України

Національний університет „Львівська політехніка”


Кафедра ЕОМ

Лабораторна робота №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

fld dword ptr[ebp+16] ; -> C


fld dword ptr[ebp+20] ; -> D
fcompp ; -> C > D
fstsw ax
sahf
je c_lower
jna c_bigger

c_lower:
;(4*c+d-1) / (c-tan(a/2)

fld dword ptr[ebp+16] ; -> C


fld const_4
fmul
fld dword ptr[ebp+20] ; -> D
fadd
fld const_1
fsub
fstp ST(3)

fld qword ptr[ebp+8]


fld const_2
fdiv
fptan
fdiv
fld dword ptr[ebp+16] ; -> C
fsubr
fld ST(3)
fdivr

jmp stop

c_bigger:

;(2*c-d/23) / (log(1-a/4))

fld dword ptr[ebp+16] ; -> C


fld const_2
fmul
fstp ST(3)
fld dword ptr[ebp+20] ; -> D
fld const_23
fdiv
fld ST(3)
fsubr
fstp ST(5)

fld qword ptr[ebp+8]


fld const_4
fdiv
fld const_1
fsubr
fstp ST(3)
FLD1
FLD ST(3)
FYL2X ; st = log2(X)
FLDLN2 ; st = log2(10)
FMUL
fld ST(5)
fdivr

jmp stop

stop:
pop ebp
ret

calc ENDP
END

Рис.1. Результат роботи програми на x32


Програма на x64:
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
.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

movlps qword ptr[rsp+8], xmm0 ; -> xmm01(high 4byte) xmm00(low 4byte)


movss dword ptr[rsp+16], xmm1 ; -> xmm00(low 4byte)
movss dword ptr[rsp+20], xmm2 ; -> xmm00(low 4byte)

finit

fld dword ptr[rsp+16] ;


fld dword ptr[rsp+20] ; -> D
fcompp ; -> C > D?
fstsw ax
sahf
je c_lower
jna c_bigger

c_lower:
;(4*c+d-1) / (c-tan(a/2)

fld dword ptr[rsp+16] ; -> C


fld const_4
fmul
fld dword ptr[rsp+20] ; -> D
fadd
fld const_1
fsub
fstp ST(3)

fld qword ptr[rsp+8]


fld const_2
fdiv
fptan
fdiv
fld dword ptr[rsp+16] ; -> C
fsubr
fld ST(3)
fdivr

jmp stop

c_bigger:

;(2*c-d/23) / (log(1-a/4))

fld dword ptr[rsp+16] ; -> C


fld const_2
fmul
fstp ST(3)
fld dword ptr[rsp+20] ; -> D
fld const_23
fdiv
fld ST(3)
fsubr
fstp ST(5)

fld qword ptr[rsp+8]


fld const_4
fdiv
fld const_1
fsubr
fstp ST(3)
FLD1
FLD ST(3)
FYL2X ; st = log2(X)
FLDLN2 ; st = log2(10)
FMUL
fld ST(5)
fdivr

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

Рис. 2. Результат роботи програми на x64


Висновок: На даній лабораторній роботі я ознайомився з принципами роботи
математичного співпроцесора і використав його можливості для обчислення
арифметичних виразів з даними дійсного типу.

You might also like