【问题标题】:Moving variable of type short into EAX using __asm in c++(VS 2010)在 c++ 中使用 __asm 将 short 类型的变量移动到 EAX(VS 2010)
【发布时间】:2012-04-09 13:40:32
【问题描述】:

在 c++ (Visual Studio 2010) 中使用 asm 插入时,当我尝试将 16 位类型的 short 变量移动到 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;
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 早期版本的程序集没有问题(如果我错了,请纠正我)。是“内联汇编”特定的错误吗?谢谢!
    • @Vis Viva:我猜那些早期版本只会强制指向变量的指针,你会读取在相邻地址发生的任何事情。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2021-06-05
      • 2019-05-01
      相关资源
      最近更新 更多