Не могу понять в чём проблема (Assembler)

У меня есть старый проект с++ в котором нужно написать Assembler код, я не очень силён в этом и у меня появилась проблема, когда я вношу данные например (x=6, k=3, d=4, a=5, c=6) у меня по идее должно выводиться результат 6, но у меня выводиться 0, я не могу понять в чем проблема, есть знающее? Вставлю только проблемный код.

// Витягаємо значення в C-перемінні — так inline asm коректно їх бачить
float x = params[0]; // x
float k = params[1]; // k
float d = params[2]; // d
float a = params[3]; // a
float c = params[4]; // c

float result = 0.0f;
float six = 6.0f;
float twelve = 12.0f;

__asm {
    finit

    // Перевірка: x <= 0 ?
    fld     [x]                // st0 = x
    fldz                       // st0 = 0.0, st1 = x
    fcomip  st(0), st(1)       // порівняння 0.0 та x  
    fstp    st(0)              // очистити залишок порівняння
    jbe     condition1         // якщо x <= 0 -> перейти до обчислення формули

    // Перевірка: x == 6
    fld [six]
    fld [x]
    fcomip st(0), st(1)    ; порівняння x і 6
    fstp st(0)
    je condition2

    // Перевірка: x == 12
    fld [twelve]
    fld [x]
    fcomip st(0), st(1)    ; порівняння x і 12
    fstp st(0)
    je condition3


    // Якщо нічого не підходить — повертаємо 0.0
    fldz
    jmp     end_asm

// Умова 1: x <= 0
condition1:
    // обчислимо ((k*x^2 + d^2 - a^3)/(2*c)) * x^2

    // x^2 (збережемо копію)
    fld     [x]               // st0 = x
    fmul    st(0), st(0)      // st0 = x^2
    fld     st(0)             // st0 = x^2 (копія), st1 = x^2

    // k * x^2
    fld     [k]               // st0 = k, st1 = x^2, st2 = x^2
    fmul    st(0), st(1)      // st0 = k*x^2, st1 = x^2

    // + d^2
    fld     [d]               // st0 = d, st1 = k*x^2, st2 = x^2
    fmul    st(0), st(0)      // st0 = d^2
    faddp   st(1), st(0)      // st0 = k*x^2 + d^2, st1 = x^2

    // - a^3
    fld     [a]               // st0 = a, st1 = k*x^2 + d^2, st2 = x^2
    fld     st(0)             // st0 = a, st1 = a, st2 = k*x^2 + d^2, st3 = x^2
    fmul    st(0), st(1)      // st0 = a^2
    fld     [a]               // st0 = a, st1 = a^2, st2 = k*x^2 + d^2, st3 = x^2
    fmul    st(0), st(1)      // st0 = a^3
    fsubp   st(2), st(0)      // st0 = k*x^2 + d^2 - a^3, st1 = x^2

    // / (2*c)
    fld1                      // st0 = 1, st1 = (k*x^2 + d^2 - a^3), st2 = x^2
    fld1                      // st0 = 1, st1 = 1, st2 = (k*x^2 + d^2 - a^3), st3 = x^2
    faddp   st(1), st(0)      // st0 = 2, st1 = (k*x^2 + d^2 - a^3), st2 = x^2
    fld     [c]               // st0 = c, st1 = 2, st2 = (k*x^2 + d^2 - a^3), st3 = x^2
    fmulp   st(1), st(0)      // st0 = 2*c, st1 = (k*x^2 + d^2 - a^3), st2 = x^2
    fdivp   st(1), st(0)      // st0 = (k*x^2 + d^2 - a^3)/(2*c), st1 = x^2

    // * x^2
    fmulp   st(1), st(0)      // st0 = result

    jmp     end_asm

// Умова 2: x == 6
condition2:
    fld     [x]               // result = x
    jmp     end_asm

// Умова 3: x == 12
condition3:
    fld     [six]             // result = 6
    jmp     end_asm

end_asm:
    fstp    [result]          // зберігаємо результат у C-перемінну
}

return result;}

Ответы (1 шт):

Автор решения: Serge3leo

совет по самому стабильному варианту реализации

float calc(const float params[5]) {
    double x = params[0];
    double k = params[1];
    double d = params[2];
    double a = params[3];
    double c = params[4];
    if (0 >= x) {
        return float(((k*x*x + d*d - a*a*a)/(2*c)) * x*x);
    } else if (6. == x || 12. == x) {
        return 6;
    }
    return 0;
}
→ Ссылка