使用嵌入式汇编程序编译错误

时间:2010-07-16 18:16:40

标签: c++ visual-studio visual-studio-2010 assembly inline-assembly

我不明白为什么这段代码

#include <iostream>
using namespace std;
int main(){
    int result=0;

    _asm{
        mov eax,3;
        MUL eax,3;
        mov result,eax;
    }

    cout<<result<<endl;
    return 0;
}

显示以下错误。

  

1&gt; c:\ users \ david \ documents \ visual studio 2010 \ projects \ assembler_instructions \ assembler_instructions.cpp(11):错误C2414:非法的操作数数量

一切似乎都很好,但为什么我会收到这个编译错误?

4 个答案:

答案 0 :(得分:11)

根据this pagemul指令只接受一个参数:

  

mul arg

     

这将“arg”乘以A寄存器中相应字节长度的值,见下表:

     

操作数大小1字节2字节4字节

     

其他操作数AL AX EAX

     

结果的较高部分存储在:AH DX EDX

中      

结果的下半部分存储在:AL AX EAX

答案 1 :(得分:4)

因此按照贾斯汀的链接说明:

#include <iostream>

int main()
{
    int result=0;

    _asm{
        mov eax, 3;
        mov ebx, 4;
        mul ebx;
        mov result,eax;
    }

    std::cout << result << std::endl;

    return 0;
}

答案 2 :(得分:2)

使用:

imul eax, 3;

或:

imul eax, eax, 3;

这样你就不必担心edx -register被破坏了。它是“有符号整数乘法”。你似乎有'int' - 结果,所以无论你是使用mul还是imul都无关紧要。

有时我在分割或乘法时没有将edx寄存器归零时出错。 CPU是Intel core2 quad Q9550

你可以阅读过令人难以置信的过度工程但正确的英特尔指令参考手册。虽然英特尔在不久前破坏了其网站。您可以尝试从AMD网站找到相同的参考手册。

更新:我找到了手册:http://www.intel.com/design/pentiumii/manuals/243191.htm

我不知道他们什么时候会再次破坏他们的网站,所以你总是需要搜索它。

Update2:ARGHL!那些是从1999年开始的......很多细节很遗憾都是一样的。

答案 3 :(得分:1)

您应该下载英特尔架构手册。

http://www.intel.com/products/processor/manuals/

为了您的目的,第2卷将对您有所帮助。

截至2010年7月,它们是最新的。