在VS中移动[eax + 4]

par*_*ara 0 c++ x86 assembly inline-assembly

我无法编译这个,我应该如何在Visual Studio中将[eax + 4]移动到y?

float x, y, z;

__asm
{
    mov x,      eax
    mov y,      [eax+4]
    mov z,      [eax+8]
}
Run Code Online (Sandbox Code Playgroud)

编辑:"错误1错误C2424:'+':'第二个操作数'中的表达式不正确"

Ray*_*hen 11

MOV指令无法将内存移动到内存.有关每条指令规则的更多详细信息,请查看您最喜欢的汇编语言参考.如果某些内容未明确列为允许,则不允许.你不能只是弥补东西.处理器非常挑剔.


Sed*_*glu 5

您将其eax用作指针,因此float x似乎不太可能将该位模式存储到其中。也许您打算复制内存中的3个浮点数[eax+0],分别为+4和+8?

@RaymondChen是正确的,您可以使用临时寄存器进行传输。显而易见的选择是临时选择ECX或EDX。那些与EAX一起使用的函数被调用,因此使用它们不会强制编译器将它们保存/恢复到包含asm块的函数中。

即使值是float,您也可以使用32位整数寄存器复制它们,而不是通过XMM0或x87寄存器复制它们。您没有对它们进行FP数学运算。

mov   ecx, [eax]
mov   x, ecx            // you probably want this, not  mov x, eax
mov   ecx, [eax+4]
mov   y, ecx
mov   ecx, [eax+8]
mov   z, ecx
Run Code Online (Sandbox Code Playgroud)

如果知道x并且y是连续的,则可以使用XMM寄存器一次复制8个字节。

  • 在[Wikipedia](http://en.wikipedia.org/wiki/X86#Addressing_modes)中,有一个清晰的摘要,列出了16位,32位和64位x86处理器的所有可能的寻址模式。 (2认同)
  • @ssg,那么在32位中它仍然不是正确的。一切都可以作为基础。 (2认同)