2016-02-14 1 views
0

J'ai un programme pour prendre l'entrée de l'utilisateur (autant que l'utilisateur veut entrer) et calculer la moyenne dans l'assemblage. Même en effaçant les registres en utilisant xor et mov eax, 0; Je ne peux pas obtenir le numéro à sortir correctement. Merci d'avance pour toute aide!Calcul de la moyenne dans l'assemblage

Sample E/S:

70 
88 
90 
77 
-1 

La réponse que je reçois est toujours un nombre très élevé

#include <iostream> 
using namespace std; 
int score = 0, avg = 0, total=0, counter = 0; 

void pnt() 
{ 
cout << "Enter your score (-1) to stop: "; 
} 
void gtsc() 
{ 
cin >> score; 
} 
void pnt_test() 
{ 
cout << total << endl; 
} 

int main() 
{ 

cout << "Let's compute your average score:" << endl; 

__asm 
{ 

    xor eax, eax 
    xor edx, edx 
    fn: 
    call pnt 
     call gtsc 
     cmp score, -1 
      je stop 
      jne add_1 
    add_1: 
     add eax, score 
     inc counter 
     jmp fn 
    stop: 
     cdq 
     mov total, eax 
     idiv counter 
     mov avg, eax 
     call pnt_test 
} 

cout << "Your average is " << avg << endl; 
system("pause"); 
return 0; 
} 
+0

Lorsque vous appelez 'pnt'' call gtsc', _EAX_ devient corrompu. _EAX_ est considéré comme un registre volatile. Un hack très inefficace serait de mettre un 'eax push' avant 'call pnt' et un' pop eax' après 'call gtsc'. Cela préserverait _EAX_ à travers les appels de fonction. Va également faire l'observation que votre moyenne sera un nombre entier puisque vous faites l'arithmétique strictement entière et la façon dont vous avez fait vos résultats vous les obtiendrez arrondis au nombre entier le plus proche. donc les valeurs de 2 et 3 donneraient 2 en moyenne. –

+0

Depuis que je suis dans une classe d'assemblage et que je n'ai pas encore appris beaucoup de choses, j'ai simplement déplacé le score sur eax et ajouté eax au total. Je vous remercie! –

Répondre

3

Vous essayez de garder le total eax mais c'est mis à mal par les fonctions pnt et gtsc . Vous pourriez vouloir ajouter à total à la place, et charger cela avant la division. Par exemple:

fn: 
call pnt 
    call gtsc 
    cmp score, -1 
     je stop 
     jne add_1 
add_1: 
    mov eax, score 
    add total, eax 
    inc counter 
    jmp fn 
stop: 
    mov eax, total 
    cdq 
    idiv counter 
    mov avg, eax 
    call pnt_test 

PS: apprendre à utiliser un débogueur.

+0

Eww, ne gardez pas encore plus de choses en mémoire quand vous avez encore beaucoup de registres d'appels préservés à utiliser pour 'counter' et' total'. @Keenan: faites que vos fonctions C++ retournent leur valeur au lieu de les stocker dans un global. Et ne pas "jne add_1" quand c'est la prochaine instruction de toute façon. –