【发布时间】:2016-02-14 23:34:21
【问题描述】:
我有一个程序来接受用户输入(用户想输入多少)并计算汇编中的平均值。即使使用 xor 和 mov eax,0 清除寄存器;我无法正确显示号码。提前感谢您的帮助!
示例 I/O:
70
88
90
77
-1
我得到的答案总是一个非常高的数字
#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;
}
【问题讨论】:
-
当您执行
call pntcall gtsc时,EAX 会被破坏。 EAX 被认为是一个易失性寄存器。一个非常低效的技巧是在call pnt之前放置一个push eax,在call gtsc之后放置一个pop eax。这将在函数调用中保留 EAX。还要观察到您的平均值将是一个整数,因为您正在执行严格的整数算术,并且您完成结果的方式会将它们四舍五入到最接近的整数。所以 2 和 3 的值将产生 2 作为平均值。 -
因为我在上装配课并且还没有学到很多东西,所以我只是将 score 移到 eax 并将 eax 添加到 total 中。谢谢!
标签: visual-c++ assembly x86 masm inline-assembly