您不能执行 mov [eax], [ebx],因为这意味着机器指令将允许您指定两个内存操作数。 x86 指令集主要是围绕机器指令设计的,这些指令允许您指定一个寄存器和一个内存操作数,因为这非常有用,并且它不会影响提取寄存器然后分步放入内存的操作的性能。
与所有复杂的指令集架构一样,有一些原则(例如上述),并且也有一些用于其他目的的规则例外。
您可能对 MOVB/MOVW/MOVD 指令感兴趣,它们分别有效:
MOV byte[edi], byte[esi]; add edi,1; add esi,1
MOV word[edi], word[esi]; add edi,2; add esi,2
MOV dword[edi], dword[esi]; add edi,4, add esi,4
(不,您无法选择寄存器;这些寄存器已硬连线以使用 ESI 和 EDI)。就其本身而言,这并不是很有趣(除了完全按照您想要的方式做之外:),但可以使用 REP 前缀重复它来构建块移动。而且芯片设计者非常努力地让这种块移动运行得极快。
[对于 64 位 x86,有一个在 qword 上运行的 MOVQ]。
如果您要编写汇编代码,那么在编写大量代码之前仔细阅读指令集描述是非常值得的。