我不明白为什么这段代码
#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:非法的操作数数量
一切似乎都很好,但为什么我会收到这个编译错误?
答案 0 :(得分:11)
根据this page,mul
指令只接受一个参数:
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)