0
我有一個程序來接受用戶輸入(與用戶想要輸入的一樣多),並計算程序集中的平均值。即使通過使用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;
}
當你調用pnt''調用gtsc'時,_EAX_被破壞。 _EAX_被視爲易失性寄存器。一種非常低效的攻擊方式是在調用pnt之前放置'push eax',在調用gtsc之後放置'pop eax'。這將在函數調用中保留_EAX_。此外,由於您正在進行嚴格的整數運算,並且您已經完成了結果,所以您也將會發現您的平均值將是一個整數,您可以將它們四捨五入到最接近的整數。所以2和3的值將平均爲2。 –
由於我在集會班,並沒有學到很多東西,我只是把分數轉移到eax,並增加了eax。謝謝! –