2010-11-02 12 views
2

Étant donné que FPU Stack n'a que 8 emplacements, comment puis-je ajouter plus d'éléments. J'ai un tableau de 10 éléments que je dois ajouter. Voici ce que j'ai jusqu'à présentAjout d'un tableau de points flottants

_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; 

    } 

Répondre

4

Conservez un total cumulé au lieu de tous les charger, puis ajoutez-les tous.

+0

En outre, il utilisera mieux le pipeline. – ruslik

3

Il n'y a pas besoin de charger d'abord, puis ajouter, vous pouvez simplement faire ceci:

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

et ainsi de suite ...

+0

oh merci pour l'astuce Fabian, j'ai fini par mettre en place une boucle tout comme Carl Norum recommandé. Curieux de savoir cependant, si je devais implémenter votre recommandation, n'aurais-je pas encore besoin d'une boucle ou utilise fadd pour continuer à ajouter des éléments au-delà de 8. – justbrianr

+0

'fadd [foo]' ne met rien sur la pile, juste ajoute foo à ce qui est actuellement le haut de la pile. Il est à peu près équivalent à la séquence 'fld [foo]'/'faddp st (1), st', sauf qu'il n'a pas vraiment besoin d'un emplacement de pile libre. Pour tout type de calcul basé sur une pile, vous ne laissez pas la pile se développer pendant une longue période, vous réduisez généralement le plus rapidement possible. –

+0

Merci encore, cela m'a aidé. – justbrianr

Questions connexes