在c++ (Visual Studio2010)中使用asm插入时,当我试图将类型为short的16位变量移到32位EAX寄存器中时,我得到了一个“类型不兼容”的错误。但是,如果我使用16位AX寄存器,则一切正常。这个错误背后的逻辑是什么?谢谢!
#include <iostream>
int main()
{
short sVar;
std::cout << "sVar=";
std::cin >> sVar;
__asm
{
MOV AX, sVar;
SHL AX, 1;
MOV sVar, AX;
}
std::cout << sVar << "\n";
return 0;
}
发布于 2012-04-09 13:44:21
逻辑很简单- eax
是32位的,而short
是16位的,所以你不能复制一个到另一个,因为它们的大小不同。ax
是16位的,所以short
可以复制到那里没有问题。然后,您可以使用movzx
或movsx
将16位值扩展为带有零或符号扩展名的32位。
发布于 2012-04-09 20:18:45
EAX是32位,sVar (短)是16位。在这种情况下,您需要查看MOVSX (带符号扩展移动)或MOVZX (带零扩展移动)。
https://stackoverflow.com/questions/10074082
复制相似问题