#include <iostream>
using namespace std;
double cpp_func(double a, double b, double c) {
return (b / a + 4.0 * c) / (c - b + 1.0);
}
double asm_func(double a, double b, double c, int& zf, int& of) {
zf = 0;
of = 0;
double result = 0.0;
double t1 = 0.0; // b / a
double t2 = 0.0; // 4 * c
double num = 0.0; // числитель
double den = 0.0; // знаменатель
const double four = 4.0;
const double one = 1.0;
__asm {
finit
; проверка a == 0
fld qword ptr[a]
fldz
fcompp
fstsw ax
sahf
jz errorZ
; t1 = b / a
fclex
fld qword ptr[b]
fdiv qword ptr[a]
fstp qword ptr[t1]
fstsw ax
test ax, 0008h
jnz errorOF
; t2 = 4 * c
fclex
fld qword ptr[c]
fmul qword ptr[four]
fstp qword ptr[t2]
fstsw ax
test ax, 0008h
jnz errorOF
; num = t1 + t2
fclex
fld qword ptr[t1]
fadd qword ptr[t2]
fstp qword ptr[num]
fstsw ax
test ax, 0008h
jnz errorOF
; den = c - b + 1
fclex
fld qword ptr[c]
fsub qword ptr[b]
fadd qword ptr[one]
fstp qword ptr[den]
fstsw ax
test ax, 0008h
jnz errorOF
; проверка den == 0
fld qword ptr[den]
fldz
fcompp
fstsw ax
sahf
jz errorZ
; result = num / den
fclex
fld qword ptr[num]
fdiv qword ptr[den]
fstp qword ptr[result]
fstsw ax
test ax, 0008h
jnz errorOF
jmp done
errorZ:
mov ebx, zf
mov dword ptr[ebx], 1
finit
jmp done
errorOF:
mov ebx, of
mov dword ptr[ebx], 1
finit
done:
}
return result;
}
int main() {
double a, b, c;
int zf = 0, of = 0;
double result;
cout << "Enter a: ";
cin >> a;
cout << "Enter b: ";
cin >> b;
cout << "Enter c: ";
cin >> c;
result = asm_func(a, b, c, zf, of);
if (zf)
cout << "Division by zero!" << endl;
else if (of)
cout << "Overflow!" << endl;
else {
cout << "ASM Result: " << result << endl;
cout << "CPP Result: " << cpp_func(a, b, c) << endl;
}
return 0;
}