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

标签 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;
}

最佳答案

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

关于c++ - 在 C++ 中使用 __asm 将 short 类型的变量移动到 EAX(VS 2010),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10074082/

相关文章:

c - 微 Controller 编程

c++ - 如何解决对自己的C++成员函数的 undefined reference ?

vb.net - VB.NET 和 Visual Studio Intellisense 中的多行 XML 注释

c++ - 当 VARBINARY(MAX) 列的大小超过 8000 字节时,bcp_bind 失败

visual-studio-2010 - 我可以在一个解决方案中运行多个项目以在 VS 2010 Ultimate 中进行调试吗?

.net - Visual Studio 2010 不显示其他已安装的框架

assembly - 在汇编 BIOS 调用中处理换行符/CR

汇编语言 move.l p, -(A3)

c++ - 如何在 .h 文件中正确定义 const int?

c++ - 同时读取多个图像openCV