为什么我们不能将数据直接从内存位置移动到另一个内存位置。

如果我问一个愚蠢的问题,请原谅我,但我认为这是一个真实的情况,至少对于我遇到的问题(8085,8086 N 80386)

我并不是真的在寻找移动数据的解决方案(例如,使用movs n all),而是实际上是这种异常的原因。

有帮助吗?

解决方案

大多数CPU品种不允许内存到内存动作。通常,CPU可以在时间时仅访问一个内存位置,这意味着您需要一个临时位置来存储该值(通常是通用寄存器)。如果您考虑一下,从一个内存位置直接移动到另一个内存位置将要求CPU能够同时访问RAM中的两个不同斑点 - 这至少意味着两个完整的内存控制器,即使到那时,他们也会播放的机会”很好:“足以访问同一RAM会很糟糕。芯片设计师可能已经能够将一些技巧从一个RAM芯片到另一个RAM芯片允许直接副本,但这将是一种非常特殊的应用功能,只需增加成本和复杂性即可解决一个非常罕见的问题。

您也许可以使用一些特殊的DMA硬件使其看起来像您的程序一样,就像在没有临时存储的情况下移动内存,至少从CPU的角度来看。

其他提示

关于什么 移动?它将ESI寻址的8/16/32位值移至EDI所寻求的位置。

基本原因是,大多数指令集允许一个寄存器操作数和一个内存操作数,并且坚持此格式使设计指令解码器更容易。它还使CPU内部的执行引擎更加容易,因为该指令通常可以将内存操作发布给一个内存位置,最多只能向一个寄存器块读取或写入。

要执行内存到内存指令,直接需要指定两个内存位置。给定寄存器/内存指令格式,这很尴尬。鉴于机器的性能,仅为此修改指令格式几乎没有理由。

更现代的CPU使用的黑客攻击是提供某种类型的块移动指令,其中源和目标位置位于寄存器中(对于x86,这分别是ESI和EDI)。然后,指令只能指定两个寄存器(或在x86的情况下 知道 哪个寄存器)。解决指令 解码 问题。

指令 执行 问题有点困难,但是人们有很多晶体管。从一个登记册中组织一个间接的读取,并通过另一个寄存器写入间接,并在硅中逐渐增加两者,但这只是咀嚼了一些晶体管。现在,您可以按照您的要求,可以使用一个指令从内存到内存。 X86指出的其他海报之一是有执行此操作的Instrucitons(Movb,Movw,Movs,...),一次是内存字节/word/...。

移动 堵塞 内存是理想的选择,因为CPU可以生成高频带读写和写入。 X86在Mov-上使用REP(重复)前缀进行此操作,以移动更大的块。

但是,如果单个工厂能够做到这一点,那么您可能会花费很长时间执行(移动1GB多长时间? - >数百万的时钟周期!),这破坏了CPU的中断响应率。

X86通过允许REP MOV-中断来解决此问题,将PC设置回指令的开头。通过适当地更新寄存器,您可以中断并重新启动具有快速移动和高中断响应率的REP MOV指令。沿着试管的更多晶体管。

RISC的家伙们发现,所有这些复杂性对于块移动指示大多是不值得的。您可以编码哑循环(甚至X86):

copy: MOV   EAX,[ESI]
      ADD   ESI,4
      MOV   [EDI],EAX
      ADD   EDI,4
      DEC   ECX
      JNE   copy

与rep mov-的基本操作相同。几乎现代CPU(x86,其他)执行此操作 所以 快速(超级量表等),公共汽车与自定义移动指令一样使用,但是现在您不需要所有这些浪费的晶体管(或相应的热量)。

您有一组地址线,一组数据线以及CPU和RAM之间的一些控制线。如果没有第二组地址线和RAM内部的一堆复杂的逻辑,您就无法直接从内存到内存移动。因此,我们必须将其临时存储在寄存器中。

您可以进行负载并共同存储的指令,并且看起来像是对程序员的一个指令,但是还有其他考虑因素,例如指令大小,有效地址计算逻辑,管道式逻辑等,使其可以保持其保留状态。更简单。

总体上,存储器记忆机的机器比负载商店的机器慢。这是由RISC研究人员在1980年左右推导/发现/发明的。因此,较旧的体系结构(VAX/OS360)倾向于具有内存记忆架构。较新的机器进行负载商店。

另一个有趣的变体是堆栈机。他们似乎总是作为少数派。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top