2
我正在處理一個分配,我必須將C代碼片段轉換爲內聯彙編。該代碼是呈現Julia分形的程序的一部分。C++和內聯彙編代碼在一個程序中具有相同的輸出,但在另一個程序中具有相同的輸出
我已經測試了兩個代碼片段的輸出,並且它們完全匹配,但是我的程序仍然輸出不同的圖像(適用於C代碼的Julia分形,內聯彙編代碼的扁平粉色屏幕)。
這是函數的開始部分以及返回
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
}
}
有兩個循環之間的差異可能會導致程序中的輸出不同?
你是否已經開始使用調試器並觀察? –
在彙編循環結束時,FPU堆棧上仍有一個值。最後的指令應該是'fstp norm'。 – 1201ProgramAlarm
@ 1201ProgramAlarm是的,修復它!我不知道我不能把東西留在FPU堆棧上。我想,案件已經結案。 – ozma