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問題なくコピーできます。次に、movzxまたはmovsxを使用して、ゼロまたは符号拡張を使用して16ビット値を32ビットに拡張できます。

于 2012-04-09T13:44:20.630 に答える
0

EAXは32ビットで、sVar(short)は16ビットです。この場合、MOVSX(符号拡張を使用して移動)またはMOVZX(ゼロ拡張を使用して移動)を調べる必要があります。

于 2012-04-09T20:18:44.547 に答える