assembly - 为什么IA32不允许内存到内存mov?

标签 assembly x86 cpu-architecture instruction-set

在Intel架构IA32中,movl、movw等指令不允许操作数同时是内存位置。例如,不允许使用指令 movl (%eax), (%edx)。为什么?

最佳答案

答案涉及对 RAM 的更全面的理解。简单来说,RAM只能处于两种状态,读模式或写模式。如果您希望将 RAM 中的一个字节复制到另一个位置,则当您从读取切换到写入时,您必须在 RAM 之外拥有一个临时存储区域。

该架构当然有可能拥有这样的 RAM 到 RAM 指令,但这将是一个高级指令,在微代码中将转换为将数据从 RAM 复制到寄存器,然后再复制回 RAM。或者,可以扩展 RAM Controller 以拥有这样一个临时寄存器用于数据复制,但它不会为增加 CPU/硬件交互的复杂性提供太多好处。

编辑:值得注意的是,最近的进步(例如混合内存立方体和高带宽内存)是 RAM 拓扑变得更像 PCI-e 的架构,并且现在直接 RAM 到 RAM 传输可能,但这是由于技术的支持逻辑,而不是 RAM 本身。在 CPU 架构中,这将采用一次巨大 RAM block 的形式,例如 DMA,而不是单个指令的形式,而且 CPU 缓存的行为类似于传统 RAM,因此架构必须将其抽象为按照我原来的解释

编辑2:根据@PeterCordes评论,我最初的理解并不完全正确; x86 实际上有一些内存到内存指令。它们不适用于大多数指令(例如 movl 和 movw)的真正原因是为了保持较低的指令编码复杂性,但它们本来可以实现它们。然而,我原来的答案中的基本思想是,RAM 之外有一个以锁存器或寄存器的形式存在的临时存储位置,这是正确的,但认为这就是这些指令不存在的原因的想法是不正确的。即使是 20 世纪 70 年代的较旧芯片(例如 6502 和 8086)也具有内存到内存指令,您可以直接在 RAM 位置轻松执行 INC 等操作。这是通过将内存读取直接锁存到 ALU 并再次返回到内存而无需通过指令集使用的寄存器来实现的。

关于assembly - 为什么IA32不允许内存到内存mov?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11953352/

相关文章:

c++ - 代码如何捕获异常?

c++ - 为什么这个循环每次迭代需要 1.32 个周期

assembly - SIMD指令用于浮点相等比较(NaN == NaN)

performance - 现代 CPU 中的小分支

eclipse - FFMPEG 的 FFT 中的 configure.h 文件和汇编器错误

c - Shellsort:用 C 编写 NASM 代码

linux - 指令内存地址是否改变?

c - 在 FPU 和 SSE 发明之前, float 转换是如何处理的?

缓存未命中和缓存命中

assembly - 函数式汇编语言