2016-02-14 190 views
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; 
} 
+0

當你調用pnt''調用gtsc'時,_EAX_被破壞。 _EAX_被視爲易失性寄存器。一種非常低效的攻擊方式是在調用pnt之前放置'push eax',在調用gtsc之後放置'pop eax'。這將在函數調用中保留_EAX_。此外,由於您正在進行嚴格的整數運算,並且您已經完成了結果,所以您也將會發現您的平均值將是一個整數,您可以將它們四捨五入到最接近的整數。所以2和3的值將平均爲2。 –

+0

由於我在集會班,並沒有學到很多東西,我只是把分數轉移到eax,並增加了eax。謝謝! –

回答

3

您嘗試將總保持eax但是這由pntgtsc功能重挫。您可能想要添加到total,並在分割之前加載。例如:

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:學會使用調試器。

+0

Eww,當你仍然有大量的調用保存寄存器用於'counter'和'total'時,不要在內存中保存更多東西。 @Keenan:讓你的C++函數返回它們的值,而不是存儲到全局。無論如何,當它是下一條指令時,請勿「jne add_1」。 –