Frage

Warum können wir die Daten nicht direkt von einem Speicherplatz in einen anderen Speicherort verschieben.

Pardon, wenn ich eine dumme Frage bin zu fragen, aber ich denke, das ist eine wahre Situation ist, zumindest für die, die ich je gesehen habe (8085,8086 n 80386)

Ich bin nicht wirklich auf der Suche nach einer Lösung, um die Daten zu bewegen (wie zB mit movs n alle), aber eigentlich der Grund für diese Anomalie.

War es hilfreich?

Lösung

Die meisten CPU-Varianten erlauben keine Speicher-zu-Speicher bewegt. Normalerweise kann die CPU bei zur Zeit nur ein Speicherplatz zugreifen, was bedeutet, dass Sie eine temporäre Stelle müssen den Wert zu speichern, wenn es (ein Mehrzweckregister, in der Regel) zu bewegen. Wenn man darüber nachdenkt, bewegend direkt von einem Speicherplatz zu einem anderen würde erfordern, dass die CPU der Lage sein, den Zugriff auf zwei verschiedenen Stellen im RAM gleichzeitig - das bedeutet zwei volle Speicher-Controller zumindest, und selbst dann sind die Chancen, sie würden „spielen schön“genug, um Zugriff auf das gleiche RAM wäre ziemlich schlecht. Die Chip-Designer möglicherweise in der Lage gewesen, einige Tricks zu ziehen direkte Kopien von einem RAM-Chip zum anderem zu ermöglichen, aber das wäre eine ziemlich spezielle-Anwendung Art von Funktion, die nur Kosten und Komplexität würde ein sehr seltenes Problem zu lösen.

Sie können möglicherweise einige spezielle DMA-Hardware verwenden, um es zu Ihrem Programm so aussehen, wie Speicher, ohne dass temporäre Speicherung bewegt wird, zumindest aus der Sicht Ihrer CPU.

Andere Tipps

Was MOVS ? Es bewegt sich ein 16.8 / 32-Bit-Wert von esi an die Stelle adressiert adressiert durch edi.

Der Hauptgrund ist, dass die meisten Befehlssätze ermöglichen eine Registeroperand, und einen Speicheroperanden und macht zu diesem Format kleben Decoder leichter, den Unterricht zu gestalten. Es macht auch den Ausführungs-Engine in dem CPU einfacher, da der Befehl typischerweise eine Speicheroperation nur einen Speicherplatz ausgeben kann, und höchstens ein Registerblock lesen oder schreiben.

einen Speicher-zu-Speicher-Anweisung zu tun erfordert direkt zwei Speicherplätze bezeichnet werden. Dies ist umständlich gegeben ein Register / Speicher-Befehlsformat. Aufgrund der Leistungsfähigkeit der Maschinen gibt es kaum eine Rechtfertigung zur Modifizierung des Befehlsformat nur für diese.

ein Hack durch modernere CPUs verwendet wird, ist eine Art von Block-Bewegungsanweisung zu schaffen, bei dem die Quell- und Zielorte in Registern angeordnet sind (für die X86 dies ESI und EDI beziehungsweise). Dann kann eine Anweisung bezeichnet nur zwei Register (oder im Fall der x86, Anweisungen, die einfach wissen die Register). Das löst die Anweisung Dekodierung Problem.

Die Anweisung Ausführung Problem ist ein wenig schwieriger, aber die Menschen haben viele Transistoren. Die Organisation ein von einem Register indirekt lesen und schreiben indirekt durch andere, und erhöhen sowohl in Silizium umständlich ist aber, dass gerade kaut auf einige Transistoren. Jetzt können Sie einen Befehl haben, dass sich von Speicher zu Speicher, wie Sie gefragt. Einer der anderen Plakate für die X86 festgestellt, gibt es instrucitons (MOVB, MOVW, MOVs, ...), die genau das tun, einen Speicher Byte / Wort / ... auf einmal.

Verschieben eines Block Speicher wäre ideal, da die CPU kann mit hohen Bandbreite erzeugt Lese- und Schreibvorgänge. Die x86 tut dies mit einem REP (Wiederholung) Präfix auf MOV- einen größeren Block zu bewegen.

Aber wenn eine einzelne insturction dies tun kann, haben Sie das Problem, dass es vielleicht eine lange Zeit dauern, auszuführen (wie lange 1Gb zu bewegen -?!> Millionen von Taktzyklen) und ruiniert die Interrupt-Reaktionsrate von der CPU.

Das x86 löst dieses Problem durch REP MOV- ermöglicht unterbrochen werden, mit dem PC zu sein Set zurück zum Anfang des Befehls. Durch die Aktualisierung in geeigneter Weise die Register während des Umzugs können Sie sowohl unterbrechen und starten Sie die REP MOV- Anweisung mit einer schnellen Block bewegen und hohe Interrupt-Response-Raten. Mehr Transistoren in dem Schlauch.

Die RISC Jungs herausgefunden, dass all diese Komplexität für einen Block Bewegungsbefehl war meist nicht wert. Sie können einen stummen Schleife kodieren (auch die x86):

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

, die die gleiche grundlegende Sache, wie REP MOV- tut. So ziemlich die modernen CPUs (x86, andere) ausführen dieses so schnell (superskalaren, etc.), dass der Bus ebenso wie die individuelle Bewegungsanweisung verwendet, aber jetzt brauchen Sie nicht alle diejenigen verschwendet -Transistoren (oder entsprechende Wärme).

Sie haben einen Satz von Adressleitungen, einen Satz von Datenleitungen und einige Steuerleitungen zwischen der CPU und RAM. Sie können nicht physisch, ohne einen zweiten Satz von Adressleitungen und einer ganzen Reihe von komplizierter Logik innerhalb des RAM direkt aus dem Speicher in dem Speicher bewegen. Deshalb haben wir es in einem Register vorübergehend zu speichern.

Sie können einen Befehl machen, die die Last tut und Speicher zusammen und sieht aus wie eine Anweisung an den Programmierer, aber es gibt auch andere Überlegungen, wie Befehlsgröße, Nicht-Duplizierung von effektiver Adresse Berechnungslogik, Pipelining usw., die es wünschenswert machen halten es einfacher.

Memory-Speicher Maschinen entpuppen im Allgemeinen langsamer als Load-Store-Maschinen. Dies wurde abgeleitet / heraus / durch die RISC-Forscher in 1980ish oder so erfunden. So sind die älteren Architekturen (VAX / OS360) neigen dazu, Speicher-Speicherarchitekturen zu haben; neuere Maschinen tun Load-Store.

Eine weitere interessante Variante ist Stapelmaschinen; sie scheinen immer als Minderheit zu sein, um.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top