Загрузка данных


#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;
}