Не могу понять в чём проблема (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;
}