【发布时间】:2013-01-08 17:40:36
【问题描述】:
我读到MOV 指令不能为其两个操作数都有内存位置。
赞:MOV [0012H], [0016H] 是不允许的。
为什么会这样?
其他指令能否为其两个操作数提供内存位置?
【问题讨论】:
-
设计的限制。操作码空间可能无法处理所有组合,并且为了获得其他指令,他们牺牲了该功能。为什么每辆有四个轮子和一个发动机的汽车都不能达到 200 英里/小时?因为那不是设计目标,他们不想为此付出成本,不实用等。
-
因为一个 ModR/M 字节只能编码一个内存操作数。但为什么不是两个?或者为什么没有一个特殊的
mov无论如何都有两个显式内存操作数?好吧,问英特尔,我猜?请注意,movs(和朋友)有两个内存操作数,但它们是隐式的。 -
Push [0012h] 有 2 个内存操作数,movs 也有;但是它们是隐含的。我认为很有可能修改为例如保留的一些编码。
mov dword ptr [bx+si+0012],3130实际使用两个偏移量和其他一些基址+索引寄存器的组合,但在 70 年代,这可能没有多大意义。它会增加解码的复杂性,并且可能需要多一个 ALU 单元。那个时候晶体管很贵。 -
This 只是一个副本。
-
Why isn't movl from memory to memory allowed? 是另一个副本,它回答了为什么它是这样设计的。