为什么一条指令在汇编中不能包含两个内存引用?

dsk*_*kim 6 x86 assembly

我是汇编语言的初学者.我已经了解到以下指令无效,因为它不能同时具有源和目标作为内存引用.我想知道原因.

movl (%eax) (%ebx)  
Run Code Online (Sandbox Code Playgroud)

Ira*_*ter 7

指令集要求设计位模式以对指令进行编码.对于每个可以想到的指令,可以有位模式,但是处理器构造起来是不实际的.因此,处理器设计者限制指令的多样性(并因此通常是样式)以使处理器构造更容易.

处理器设计的一个共同主题是指令在一个寄存器和一个存储器位置上运行.两个操作数意味着这种风格可以加载内存来注册,将寄存器存储到内存,以及各种常见的二进制操作,例如添加内存来注册,比较寄存器到内存等.这个主题在实践中运行良好,几乎不需要对于在多个内存位置上工作的指令,它的规律性使得CPU的"中央"处理部分更容易实现.你提到的"movl"指令符合这个主题,因此只有一个内存操作数.

所以真正的答案是,拥有这样一条指令的回报并不能证明工程的合理性.

大多数处理器设计现在已经存在了20多年,现在晶体管相对便宜.因此,几乎所有这些机器的指令集都变得更加复杂,通常包括一些指向多个存储器操作数的指令.但这些说明是例外,而不是规则.

  • 好的一点是,它是指令编码的限制,而不是任何东西。x86 具有内存到内存指令,但最多有一个使用完整寻址模式的“显式”内存操作数。例如“push [ebx + ecx]”或“movsb”。如果您指出即使存在的内存/内存指令也没有两种显式寻址模式,因此解码器只需要一次处理一种,这将是一个更好的答案。 (2认同)