2011-01-07 24 views
2

私はVS2010で開かれたVS6で作成されたC++プロジェクトを持っています。私がしようとするとVS2010での新しいMFC C++プロジェクトを作成し、上に示したアセンブリコードでクラスを追加するまで、Visual Studio 2010は、Visual Studio 6のようにC++でインラインアセンブリをコンパイルしますか?

__asm{ 
    mov eax,this 
    mov esi,[eax].m_pImage 
    ... 

すべての罰金とダンディ:それは、次のコードを含むインラインアセンブリのビットを持つクラスが含まれています。 __asmの新しい解釈は以下のようにコードを必要と突然、これはコンパイルされません(または類似した何かが、これはどのような場合にコンパイルされます):

__asm{ 
    mov eax,this 
    mov esi,[eax]this.m_pImage 
    ... 

を今、私の人生のために、私は理解できませんVS2010で変換されたVS6プロジェクトが(おそらく現在無効な)インラインアセンブリコードをコンパイルできるようにする2つのプロジェクトの違いは何か、新しく作成されたプロジェクトではできません。

古いVS6コンパイラを使用できるように(隠した)設定がありますか?

+0

なぜインラインアセンブラを使用するのですか? – Puppy

答えて

2

VS6インラインASMは修正されたバグのようです。コンパイラがm_pImageが、eaxレジスタにロードされたもののメンバーであったため、オフセットを見つけることができなかったことをコンパイラがどのように検証できるか分からないので、私はそれを言います。あなたの質問に答えるために、私は、VS6コンパイラで古いASMセマンティクスを使用する方法はありません。

ローカル変数をインラインASM外に作成し、それを代わりにesiに割り当てます。

void * pointer = this.m_pImage; 
__asm 
{ 
    mov ebx, pointer 
    mov esi, ebx 
    ... 
+1

VS6からプロジェクトを変換するとき(そしてVS6のみ - これは他のバージョンでは起こりません)、1トンの互換性設定が適用されます。このバグ修正が追加された可能性がありますが、古いcodepathはまだVS6互換モードで使用されています。 –

+0

これらの互換性設定を複製する方法はありませんか? – Daan

+0

その最後のコメントを無視する...答えとBillyのコメントをもう一度読んで、われわれはバグのあるレガシーVS6コードをこの年齢で働かせたくないということを私に明らかにする。 – Daan