使用嵌入式汇编程序编译错误
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 月版手册。以上是关于使用嵌入式汇编程序编译错误的主要内容,如果未能解决你的问题,请参考以下文章