我无法编译这个,我应该如何在 Visual Studio 中将 [eax+4] 移动到 y ?
float x, y, z;
__asm
{
mov x, eax
mov y, [eax+4]
mov z, [eax+8]
}
编辑:
错误 1 错误 C2424:“+”:“第二个操作数”中的表达式不正确
我无法编译这个,我应该如何在 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
似乎不太可能。也许您打算在[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 个字节。
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
}