2017-09-24 151 views
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 
    } 
    } 

有兩個循環之間的差異可能會導致程序中的輸出不同?

+0

你是否已經開始使用調試器並觀察? –

+3

在彙編循環結束時,FPU堆棧上仍有一個值。最後的指令應該是'fstp norm'。 – 1201ProgramAlarm

+0

@ 1201ProgramAlarm是的,修復它!我不知道我不能把東西留在FPU堆棧上。我想,案件已經結案。 – ozma

回答

2

由於1201ProgramAlarm在註釋中提到,只需在每次循環迭代結束時從FPU彈出剩餘的值範數。

相關問題