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


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