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

Posted

技术标签:

【中文标题】使用嵌入式汇编程序编译错误【英文标题】:Compile error with embedded assembler 【发布时间】:2010-07-16 18:16:39 【问题描述】:

我不明白为什么这个代码

#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>c:\users\david\documents\visual studio 2010\projects\assembler_instructions\assembler_instructions.cpp(11): error C2414: 非法操作数数

一切似乎都很好,但为什么会出现此编译器错误?

【问题讨论】:

我添加了 Visual Studio 和 assembler 标签,因为这个问题与 C++ 关系不大。 我现在手头没有任何参考资料,而且我在 google 上失败了...... MUL reg, imm 不是非法的(至少在 8086 兼容模式下,这可能是编译器默认的)? 【参考方案1】:

根据this page,mul 指令只需要一个参数:

多重参数

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

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

其他操作数 AL AX EAX

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

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

【讨论】:

@Davit:换句话说,试试mul 3 你需要在MUL操作符中使用另一个寄存器【参考方案2】:

因此按照贾斯汀的链接进行注释:

#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;

【讨论】:

【参考方案3】:

用途:

imul eax, 3;

或:

imul eax, eax, 3;

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

有时我会因为在除法或乘法时没有将 edx 寄存器归零而出错。 CPU 是 Intel core2 quad Q9550

您可以阅读过度设计但正确的英特尔指令参考手册。虽然英特尔前一段时间破坏了它的网站。不过,您可以尝试从 AMD 网站查找相同的参考手册。

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

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

更新 2:阿格尔!那些是从 1999 年开始的。不幸的是,大多数细节都是一样的。

【讨论】:

【参考方案4】:

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

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

出于您的目的,第 2 卷对您的帮助最大。

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

【讨论】:

@Cheery:谷歌搜索“英特尔 x86 指令集参考”。该链接指向 2010 年 6 月版手册。

以上是关于使用嵌入式汇编程序编译错误的主要内容,如果未能解决你的问题,请参考以下文章

QML 模块未安装错误:在嵌入式 Linux 上运行 Qt 应用程序

keil5不查版编译会报错吗?

使用Go语言交叉编译开发嵌入式Linux应用程序

使用Go语言交叉编译开发嵌入式Linux应用程序

2014025627 《嵌入式程序设计》第二周学习总结

2014025658《嵌入式系统程序设计》第二周学习总结