在Intel架构IA32中,movl、movw等指令不允许操作数同时是内存位置。例如,不允许使用指令 movl (%eax), (%edx)。为什么?
答案涉及对 RAM 的更全面的理解。简单来说,RAM只能处于两种状态,读模式或写模式。如果您希望将 ram 中的一个字节复制到另一个位置,您must当您从读切换到写时,在 RAM 之外有一个临时存储区域。
该架构当然有可能具有这样的 RAM 到 RAM 指令,但这将是一个高级指令,在微代码中将转换为将数据从 RAM 复制到寄存器,然后再复制回 RAM。或者,可以扩展 RAM 控制器以拥有这样的临时寄存器just对于这种数据复制,但它不会为 CPU/硬件交互的复杂性增加提供太多好处。
EDIT:值得注意的是,最近的进步(例如混合内存立方体和高带宽内存)是一种架构,其中 RAM 拓扑变得更像 PCI-e,并且现在可以直接进行 RAM 到 RAM 传输,但这是由于支持逻辑技术,而不是 RAM 本身。在 CPU 架构中,这将采用一次巨大 RAM 块的形式,例如 DMA,而不是单个指令的形式,而且 CPU 缓存的行为类似于传统 RAM,因此架构必须将其抽象为根据我原来的解释
EDIT2:根据 @PeterCordes 的评论,我最初的理解并不完全正确; x86 实际上有一些内存到内存指令。它们不适用于大多数指令(例如 movl 和 movw)的真正原因是为了保持较低的指令编码复杂性,但它们本来可以实现它们。然而,我原来的答案中的基本思想是,RAM 之外有一个以锁存器或寄存器的形式存在的临时存储位置,这是正确的,但认为这就是这些指令不存在的原因的想法是不正确的。即使是 20 世纪 70 年代的较旧芯片(例如 6502 和 8086)也具有内存到内存指令,您可以直接在 RAM 位置轻松执行 INC 等操作。这是通过将内存读取直接锁存到 ALU 并再次返回到内存而无需通过指令集使用的寄存器来实现的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)