1

在 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;
}
4

2 回答 2

5

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

于 2012-04-09T13:44:20.630 回答
0

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

于 2012-04-09T20:18:44.547 回答