2017-04-12 9 views
0

私はVisual Studio 2017を使用しており、32ビット用にコンパイルしています。なぜローカル算術演算を使用しているときにmov算術演算でこの有効なアセンブリがコンパイルされないのですか?

私は以下のコードスニペットがあります。コンパイルされないステートメントは、「無効なオペランド」エラーを示します。

int localVar = 0; 
__asm { 
    mov eax,  [esp+4]   <----- compiles 
    mov localVar, esp   <----- compiles 
    mov localVar, [esp]   <----- doesn't compile 
    mov localVar, [esp+4]   <----- doesn't compile 
} 

私は2番目と3番目の文は等価ではないことを認識してんだけど、私は次の点を強調したかった...

基本的に、私は2番目の周り​​にブラケットを使用している場合と思われますオペランドをこのようにして、結果をローカル変数に格納します。私は、そのような結果をeaxに格納する最初のステートメントで証明されているように、有効な構文であるかのような角括弧を使用しているという印象の下にいました。

私はそれが私の変数型と関係があるかもしれないと推測しており、movmovlに変更しようとしましたが、どちらも動作しません。

基本的に私の究極の目標はこれが正しく機能するようにすることです: mov localVar, [esp+4] これはどのように達成するのですか? localVarのタイプはintである必要はありません...私はちょうどそれがうまくいくと思った。

+1

を登録する、またはレジスタからメモリへのメモリから移動することができますが、メモリから直接移動することはできませんメモリへ。 – Barmar

答えて

2

x86命令セットにメモリからメモリへの移動命令がありません。すべての命令は、2つのレジスタまたは1つのレジスタおよびメモリ位置のいずれかを含む。変数localVarはメモリの場所です。基本的に何を書いていることは次のとおりです。

movdw [ebp-4], [esp+4] 

代わりにあなたが持っている必要があります。

mov eax, [esp+4] 
mov localVar, eax 
関連する問題