Visual C ++ и встроенный ассемблерный код имеют одинаковый вывод в одной программе, но разные в другой

Я работаю над заданием, в котором мне нужно преобразовать фрагмент кода на C во встроенную сборку. Код является частью программы, которая отображает фрактал Джулии.

Я протестировал выходные данные обоих фрагментов кода, и они точно совпадают, но моя программа по-прежнему выводит другое изображение (правильный фрактал Джулии для кода C, плоский розовый экран для встроенного кода сборки).

Это начальная часть функции, а также возвращение

COLORREF render_point(const double &a,
const double &b, int N) {
double cRe = -0.5;
double cIm = -0.05;
double x(a), y(b);
double norm = x*x+y*y;
int n;
double three = 3.0;

(loop goes here)

return HSVtoRGB(n % 256, 255 , 255 *(n<N));
}

Вот код C

for (n = 0; norm < 4.0 && n < N; ++n)
{
double old_x = x;
double old_y = y;

x = (old_x * old_x * old_x) - (3 * old_y * old_y * old_x) + cRe;
y = (3 * old_y * old_x * old_x) - (old_y * old_y * old_y) + cIm;

norm = x*x+y*y;
}

и встроенный код сборки:

for (n = 0; norm < 4.0 && n < N; ++n)
{
__asm {
// Create (old_x * old_x * old_x)
fld x;
fmul x;
fmul x;

// Create (3 * old_y * old_y * old_x)
fld three;
fmul y;
fmul y;
fmul x;

// Create the full equation for x
fsubp st(1), st(0);
fadd cRe;

// Create (3 * old_y * old_x * old_x) + cIm
fld three;
fmul y;
fmul x;
fmul x;
fadd cIm;

// Create (old_y * old_y * old_y)
fld y;
fmul y;
fmul y;

fsubp st(1), st(0); // Create the full equation for y

fst y;              // Store in y to use for next loop
fmul st(0), st(0);  // Get y*y

fxch st(1);         // Swap places of y*y with newly calculated x
fst x;              // Store in x to use for next loop

fmul st(0), st(0);  // Get x*x

faddp st(1), st(0); // Get x*x + y*y
fst norm;           // Set loop variable
}
}

Есть ли разница между двумя циклами, которая может привести к разным выводам в программе?

2

Решение

Как упоминалось в комментарии 1201ProgramAlarm, нужно было просто вытолкнуть оставшуюся норму значения из FPU в конце каждой итерации цикла.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]