2010-11-02 74 views
2

由於FPU堆棧只有8個插槽,我該如何添加更多的元素。我需要添加10個元素的數組。這是我到目前爲止的內容添加一個浮點數組

_Average proc 

     finit 

     mov ecx, [esp + 4]  ; get the number of elements 
     mov ebx, [esp + 8]  ; get the address of the array 

     fld  REAL8 PTR [ebx]  ; get first element of array 
     fld  REAL8 PTR [ebx + 8] ; get second element of array 
     fld  REAL8 PTR [ebx + 16]; this element is now at the top of the stack 
     fld  REAL8 PTR [ebx + 24] 
     fld  REAL8 PTR [ebx + 32] 
     fld  REAL8 PTR [ebx + 40] 
     fld  REAL8 PTR [ebx + 48] 
     fld  REAL8 PTR [ebx + 56] 
     ;fld  REAL8 PTR [ebx + 64] 
     ;fld  REAL8 PTR [ebx + 72] 

     fadd 
     fadd 
     fadd 
     fadd 
     fadd 
     fadd 
     fadd 
     ;fadd 
     ;fadd 
     fwait ; if necessary wait for the co-processor to finish 
     ret 
_Average endp 

extern "C" double Average (int, double []); 

void main() 
    { 
    double Array1 [10] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.0}; 

    double Array2 [11] = {-1.1, -2.2, -3.3, -4.4, -5.5, -6.6, -7.7, -8.8, -9.9, -10.0, -11.0}; 

    cout << "Average of Array1 is " << Average (10, Array1) << endl; 

    cout << "Average of Array2 is " << Average (11, Array2) << endl; 

    } 

回答

4

保持運行總計而不是加載它們全部,然後將它們全部添加。

+0

此外,它會使用管道更好。 – ruslik 2010-11-02 03:02:25

3

有沒有需要加載第一再加入,你可以這樣做:

fld real8 ptr [ebx] 
fadd real8 ptr [ebx + 8] 
fadd real8 ptr [ebx + 16] 
fadd real8 ptr [ebx + 24] 

等等...

+0

感謝Fabian的提示,我最終設置了一個像Carl Norum推薦的循環。但是要知道,如果我要實現你的建議,我是否還需要一個循環或者使用fadd,讓我繼續添加超過8的元素。 – justbrianr 2010-11-02 04:31:41

+0

'fadd [foo]'不會把任何東西放到堆棧上,它只是將foo添加到當前堆棧的頂部。它大致等同於序列'fld [foo]'/'faddp st(1),st',除非它實際上並不需要空閒的堆棧槽。對於任何基於堆棧的計算,您都不會讓堆棧長時間增長,您通常會盡快減少。 – 2010-11-02 08:14:01

+0

再次感謝,幫助。 – justbrianr 2010-11-02 15:00:17