【发布时间】:2019-06-26 04:59:43
【问题描述】:
我可以这样做:
mov eax, ebx
还有这个:
mov [eax], ebx
甚至这个:
mov eax, [ebx]
但不是这个(错误 C2415):
mov [eax], [ebx]
只是 wtf... 为什么? 和 *ptr1 = *ptr2 一样,为什么我可以将一个寄存器复制到另一个寄存器,通过寄存器中的地址将值复制到另一个寄存器或将寄存器的值复制到另一个寄存器中存储的地址...
但它不能将一个地址上的值复制到另一个地址。为什么?
【问题讨论】:
-
x86 处理器不支持
mov的两个内存操作数。请查阅指令集参考和/或基本架构手册。要实现您想要的,您需要通过注册。 -
因为CPU不支持
-
这是
*ptr1 = *ptr2编译为:godbolt.org/z/6xQhcR -
不要把汇编当作“编程语言”,它更像是“CPU指令的名称”,即CPU供应商在硬件中实现的东西,在汇编器中作为指令可用。有一些例外,比如有一些辅助宏或“伪指令”(一个伪指令被转置为多个本机指令),但通常映射是 1:1,即源代码文本中的一条指令映射到一条识别的硬件指令通过 CPU。如果 CPU 供应商不提供
mov [eax],[ebx],那么汇编器就无能为力了(至少它会报告错误,有些不会;))。