我正在使用Visual Studio 2017并编译为32位。
假设我有以下代码片段。未编译的语句给出"无效操作数"错误。
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 条语句并不等同,但我想强调以下几点......
从本质上讲,如果我以这种方式在第二个操作数周围使用括号并将结果存储到局部变量中,它似乎不起作用。我的印象是使用这样的括号是有效的语法,正如将结果存储到 eax
中的第一个语句所证明的那样。
推测这可能与我的变量类型有关,我试图mov
更改为movl
但这也不起作用。
基本上,我的最终目标是使其正常工作: mov localVar, [esp+4]
我如何实现这一点?localVar
的类型不必int
...我只是认为这应该有效。
x86指令集没有内存到内存移动指令。所有指令都涉及两个寄存器或一个寄存器和一个存储器位置。变量localVar
是内存位置。本质上你正在写的是:
movdw [ebp-4], [esp+4]
相反,您应该拥有:
mov eax, [esp+4]
mov localVar, eax