2010-11-02 42 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