7

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

movl (%eax) (%ebx)  
4

3 回答 3

8

指令集要求将位模式设计为​​对指令进行编码。每个可能的指令都可以有位模式,但是这样处理器就不实用了。因此处理器设计者限制指令的种类(因此通常是样式)以使处理器构造更容易。

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

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

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

于 2013-07-07T17:43:25.000 回答
3

没有真正的原因- 这只是英特尔指令集的定义方式。但是,有一些Intel 指令确实需要两个内存引用:movs例如。

于 2013-07-07T17:38:30.957 回答
-2

使用DMA在内存中移动数据比 cpu 更快。

于 2021-09-07T01:25:45.950 回答