#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;
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
fld qword ptr[b]
fdiv qword ptr[a]
fstsw ax
test ax, 0008h
jnz errorOF
; 4 * c
fld qword ptr[c]
fmul qword ptr[four]
fstsw ax
test ax, 0008h
jnz errorOF
; b / a + 4 * c
faddp st(1), st
fstsw ax
test ax, 0008h
jnz errorOF
; знаменатель: c - b + 1
fld qword ptr[c]
fsub qword ptr[b]
fadd qword ptr[one]
fstsw ax
test ax, 0008h
jnz errorOF
; проверка знаменателя == 0
fldz
fcompp
fstsw ax
sahf
jz errorZ
; пересчитываем знаменатель, потому что fcompp снял его со стека
fld qword ptr[c]
fsub qword ptr[b]
fadd qword ptr[one]
fstsw ax
test ax, 0008h
jnz errorOF
; итоговое деление
fdivp st(1), st
fstsw ax
test ax, 0008h
jnz errorOF
fstp qword ptr[result]
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 = 0.0;
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;
}