【问题标题】:Calculating average in assembly在装配中计算平均值
【发布时间】: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 pnt call 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


【解决方案1】:

您尝试将总数保留在 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:学习使用调试器。

【讨论】:

  • Eww,当您仍有大量用于countertotal 的调用保留寄存器时,不要在内存中保留更多内容。 @Keenan:让你的 C++ 函数返回它们的值,而不是存储到全局。无论如何,当它是下一条指令时,不要jne add_1
猜你喜欢
  • 1970-01-01
  • 2011-12-04
  • 2013-01-14
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多