在c ++中使用__asm将short类型的变量移动到EAX中(VS 2010)

时间:2012-04-09 13:40:32

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

在c ++(Visual Studio 2010)中使用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;
}

2 个答案:

答案 0 :(得分:5)

逻辑很简单 - eax是32位而short是16位,所以你不能将一个复制到另一个,因为它们的大小不同。 ax是16位,因此可以复制short没问题。然后,您可以使用movzxmovsx将16位值扩展为32位,使用零或符号扩展名。

答案 1 :(得分:0)

EAX是32位,sVar(短)是16位。在这种情况下,您需要查看MOVSX(带符号扩展的移动)或MOVZX(带零扩展的移动)。