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;
}
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. –
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! –