【问题标题】:Why can't MOV have both operands as memory locations? [closed]为什么 MOV 不能将两个操作数都作为内存位置? [关闭]
【发布时间】: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? 是另一个副本,它回答了为什么它是这样设计的。

标签: assembly x86-16


【解决方案1】:

这是他们创建 CPU 时的设计决定。你有更多的寻址模式和更多的指令,指令得到的更大(就表示指令所需的位数而言)。而更大的指令需要更长的时间从内存中获取。

也就是说,x86 的指令集不是orthogonal。只编写非常有限的汇编代码并不一定是坏事,至少现在不是。

其他一些 CPU(例如同一时代设计的 MC680xx)可以做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多