0

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

float x, y, z;

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

编辑:

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

4

3 回答 3

11

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

于 2012-09-16T15:36:20.340 回答
4

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

@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

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

于 2012-09-16T15:57:39.173 回答
-2
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
}
于 2019-11-26T09:43:48.973 回答