#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) {
zf = 0;
double result = 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
; числитель: b / a + 4 * c
fld qword ptr[b]
fdiv qword ptr[a]
fld qword ptr[c]
fmul qword ptr[four]
faddp st(1), st
; знаменатель: c - b + 1
fld qword ptr[c]
fsub qword ptr[b]
fadd qword ptr[one]
; проверка знаменателя == 0
fldz
fcompp
fstsw ax
sahf
jz errorZ
; заново считаем знаменатель, потому что fcompp его снял со стека
fld qword ptr[c]
fsub qword ptr[b]
fadd qword ptr[one]
; деление числителя на знаменатель
fdivp st(1), st
fstp qword ptr[result]
jmp done
errorZ :
mov ebx, zf
mov dword ptr[ebx], 1
finit
done :
}
return result;
}
int main() {
double a, b, c;
int zf = 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);
if (zf)
cout << "Division by zero!" << endl;
else {
cout << "ASM Result: " << result << endl;
cout << "CPP Result: " << cpp_func(a, b, c) << endl;
}
return 0;
}