在 VS 中移动 [eax+4]

Move [eax+4] in VS

本文关键字:eax+4 移动 VS      更新时间:2023-10-16

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

float x, y, z;
__asm
{
    mov x,      eax
    mov y,      [eax+4]
    mov z,      [eax+8]
}

编辑:

错误

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

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

您使用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

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

float x, y, z;
__asm
{
    mov x,      eax
    push        eax
    mov eax,    [eax+4]
    mov y,      eax
    pop         eax
    mov eax,    [eax+8]
    mov z,      eax
}