私は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
に格納する最初のステートメントで証明されているように、有効な構文であるかのような角括弧を使用しているという印象の下にいました。
私はそれが私の変数型と関係があるかもしれないと推測しており、mov
をmovl
に変更しようとしましたが、どちらも動作しません。
基本的に私の究極の目標はこれが正しく機能するようにすることです: mov localVar, [esp+4]
これはどのように達成するのですか? localVar
のタイプはint
である必要はありません...私はちょうどそれがうまくいくと思った。
を登録する、またはレジスタからメモリへのメモリから移動することができますが、メモリから直接移動することはできませんメモリへ。 – Barmar