Frage

Ich habe eine grundlegende Frage zu Montage.

Warum tun wir nur arithmetische Operationen an Registern plagen, zu tun, wenn sie auf das Gedächtnis so gut funktionieren können?

Zum Beispiel der beide folgenden Ursachen (im Wesentlichen) der gleiche Wert wie eine Antwort berechnet werden:

Snippet 1

.data
    var dd 00000400h

.code

    Start:
        add var,0000000Bh
        mov eax,var
        ;breakpoint: var = 00000B04
    End Start


Snippet 2

.code

    Start:
        mov eax,00000400h
        add eax,0000000bh
        ;breakpoint: eax = 0000040B
    End Start


 Von dem, was ich kann die meisten Texte und Übungen sehen Sie meist arithmetische Operationen an Registern. Ist es nur schneller zur Arbeit mit Registern?

Edit: Das ist schnell war:)

Ein paar großen Antworten gegeben wurden; beste Antwort gewählt wurde, basierend auf der ersten gute Antwort.

War es hilfreich?

Lösung

Die Register sind viel schneller und auch die Operationen, die Sie direkt auf Speicher durchführen können, sind weit mehr beschränkt.

Andere Tipps

Wenn Sie auf Computer-Architekturen suchen, finden Sie eine Reihe von Speicherebenen. Diejenigen, die in der Nähe der CPU sind die schnelle, teuer (pro einem Bit) und daher klein, während am anderen Ende Sie haben große, langsam und billige Speichergeräte. In einem modernen Computer, dies sind in der Regel so etwas wie:

 CPU registers (slightly complicated, but in the order of 1KB per a core - there
                are different types of registers. You might have 16 64 bit
                general purpose registers plus a bunch of registers for special
                purposes)
 L1 cache (64KB per core)
 L2 cache (256KB per core)
 L3 cache (8MB)
 Main memory (8GB)
 HDD (1TB)
 The internet (big)

Im Laufe der Zeit mehr und mehr Cache-Ebene hinzugefügt wurde - ich eine Zeit erinnern kann, wenn CPUs kein Onboard-Caches hat, und ich bin nicht einmal alt! In diesen Tagen, HDDs sind mit an Bord Caches und das Internet wird in einer beliebigen Anzahl von Orten im Cache gespeichert. Im Speicher auf der Festplatte, und vielleicht auf das Caching-Proxy-Server

Es gibt eine dramatische (oft um Größenordnung) Abnahme der Bandbreite und die Erhöhung der Latenz in jedem Schritt weg von der CPU. Zum Beispiel könnte eine HDD der Lage sein, auf 100MB zu lesenden / mit einer Latenzzeit von 5 ms s (diese Zahlen nicht exakt richtig sein), während der Hauptspeicher bei 6,4 GB lesen können / s mit einer Latenz von 9ns (sechs Zehner Größe!). Die Latenz ist ein sehr wichtiger Faktor, wie Sie die CPU warten länger nicht behalten wollen, als es muss (dies gilt vor allem für Architekturen mit tiefen Pipelines, aber das ist eine Diskussion für einen anderen Tag).

Die Idee ist, dass man oft die gleichen Daten immer und immer wieder wiederverwendet, so dass es sinnvoll ist, für nachfolgende Operationen in einem kleinen, schnellen Cache zu setzen. Dies bezeichnet man als zeitliche Lokalität . Ein weiteres wichtiges Prinzip der Lokalität ist räumliche Lokalität , die besagen, dass Speicherplatz in der Nähe von ihnen wahrscheinlich etwa zur gleichen Zeit gelesen werden. Es ist aus diesem Grunde, dass ein viel größerer RAM-Block aus dem RAM liest, wird dazu führen, gelesen und in on-CPU-Cache gestellt werden. Wenn es nicht für diese Prinzipien des Ortes war, dann ist jede Stelle im Speicher zu jeder Zeit eine ebenso wahrscheinlich Chance, gelesen hätte, so gäbe es keine Möglichkeit, vorherzusagen, was als nächstes zugegriffen wird, und alle Ebenen des Cache in der Welt verbessern wird nicht Geschwindigkeit. Genauso gut könnte man nur eine Festplatte zu verwenden, aber ich bin sicher, dass Sie wissen, wie es ist, zum Erliegen der Computer kommen zu haben, wenn Paging (die im Grunde ist die HDD als Erweiterung RAM verwenden). Es ist vom Konzept her möglich kein Gedächtnis hat mit Ausnahme einer Festplatte (und viele kleinen Geräte verfügen über einen einzigen Speicher), aber das wäre langsam schmerzlich im Vergleich zu dem, was wir sind vertraut mit.

Ein weiterer Vorteil von Registern (und nur eine kleine Anzahl von Registern) ist, dass es läßt Sie haben kürzere Anweisungen . Wenn Sie Anweisungen, die zwei (oder mehr) 64-Bit-Adressen enthalten, werden Sie einige lange Anweisungen haben!

Register zugegriffen Weg schneller als RAM-Speicher, da müssen Sie den „langsamen“ Speicherbus nicht zugreifen!

x86, wie so ziemlich jeder andere „normale“ CPU Sie Montage lernen könnte für, ist ein "-Register Maschine ". Es gibt andere Möglichkeiten, etwas zu gestalten, dass Sie (zum Beispiel einer Turing-Maschine, dass sie entlang einer logischen „Band“ im Speicher) programmieren können, aber registrieren Maschinen unter Beweis gestellt haben für High-Performance im Grunde der einzige Weg zu gehen sein.

Da x86 Gebrauch Register entwickelt wurde, kann man nicht wirklich, sie ganz vermeiden, selbst wenn man wollte und hat über die Leistung nicht.

Aktuelle x86-CPUs können lesen / schreiben viele mehr Register pro Taktzyklus als Speicherplätze.

Zum Beispiel Intel Skylake zwei Lasten tun und einen Speicher von / nach seinen 32kiB 8-Wegen assoziativen L1D-Cache pro Zyklus (best case), kann aber nach oben von 10 Registern pro Takt lesen und schreiben 3 oder 4 (plus EFLAGS) .

Der Aufbau eines L1D-Cache mit so vielen Lese- / Schreib-Ports als die Registerdatei wäre unerschwinglich teuer (in Transistorzahl / Bereich und Stromverbrauch), vor allem, wenn Sie es so groß halten wollten, wie es ist. Es ist wahrscheinlich nur physikalisch nicht möglich zu bauen etwas, das Gedächtnis, die Art und Weise x86 Anwendungen Register mit der gleichen Leistung verwenden kann.

Auch ein Register zu schreiben und sie dann wieder zu lesen hat im wesentlichen Null, da die Latenzzeit CPU erkennt dies und leitete das Ergebnis direkt vom Ausgang einer Ausführungseinheit mit dem Eingang eines anderen, die Rückschreib-Stufe umgeht. (Siehe https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Solution_A._Bypassing ).

Diese Ergebnis-Forwarding-Verbindungen zwischen Ausführungseinheiten sind das „Bypass-Netzwerk“ oder „Weiterleitungsnetz“ genannt, und es ist viel einfacher für die CPU dies für ein Register Design zu tun, als ob alles hatte in dem Speicher zu gehen und wieder heraus. Die CPU hat nur eine 3 bis 5-Bit-Register-Nummer zu überprüfen, statt einer 32-Bit oder 64-Bit-Adresse, Fälle zu erkennen, in dem die Ausgabe eines Befehls als Eingabe sofort für eine weitere Operation erforderlich ist. (Und die Registernummern sind hartcodiert in den Maschinencode, so dass sie weg verfügbar recht.)

Wie andere erwähnt haben, 3 oder 4 Bits das Maschinencode-Format macht viel kompakter ein Register zu adressieren, als wenn jeder Befehl absolute Adressen hatte.


Siehe auch https://en.wikipedia.org/wiki/Memory_hierarchy : Sie denkt von Registern kann als kleines schnellen mit fester Größe Speicherplatz getrennt vom Hauptspeicher, in dem nur direkten absolute Adressierung unterstützt. (Sie können nicht „Index“ ein Register. Eine ganze Zahl N in einem Register gegeben, man kann nicht den Inhalt des Nth Registers mit einem insn erhalten)

Die Register sind auch privat zu einem einzigen CPU-Kern, so out-of-Order kann die Ausführung tun, was es mit sich will. Mit Speicher, muss es Sorgen über das, was um die Dinge werden sichtbar für andere CPU-Kerne.

eine feste Anzahl von Registern zu haben, ist Teil dessen, was können CPUs do register Umbenennung out-of-Order-Ausführung. die Registernummer sofort zu haben, wenn ein Befehl macht decodiert wird auch dies einfacher. Es ist nie ein Lese- oder Schreibvorgang auf ein noch nicht bekannten Register

Unter

Wir verwenden Register, weil sie schnell sind. Normalerweise arbeiten sie bei CPU-Geschwindigkeit.
Register und CPU-Cache werden mit verschiedenen Technologie / Stoffen und
die sind teuer. RAM auf der anderen Seite ist billig und 100-mal langsamer.

Im Allgemeinen Register Arithmetik ist viel schneller und viel bevorzugt. Es gibt jedoch einige Fälle, in denen die direkten Speicher Arithmetik nützlich ist. Wenn alles, was Sie tun wollen eine Zahl im Speicher ist Schritt (und nichts anderes zumindest für ein paar Millionen Instruktionen), dann ein einzelner direkten Speicher Rechenbefehl ist in der Regel etwas schneller als Last / add / store.

Auch wenn Sie komplexe Array-Operationen tun, müssen Sie in der Regel eine Menge von Registern, um zu verfolgen, wo Sie sind und wo Sie Ihre Arrays beenden. Auf älteren Architekturen könnten Sie aus dem Register laufen sehr schnell, so dass die Option zum Hinzufügen von zwei Speicherbits zusammen ohne Ihre aktuellen Register Zappen wirklich nützlich war.

Ja, es ist viel viel viel schneller Einsatz Register. Selbst wenn Sie nur den physischen Abstand von Prozessor betrachten im Vergleich zu proc in dem Speicher zu registrieren, Sie spart eine Menge Zeit nicht Elektronen so weit zu senden, und das bedeutet, können Sie mit einer höheren Taktrate laufen.

Ja - auch können Sie in der Regel Push / Pop-Register leicht Prozeduren für den Aufruf, die Handhabung von Interrupts, etc.

Es ist nur, dass der Befehlssatz wird nicht zulassen, dass solche komplexen Operationen tun:

add [0x40001234],[0x40002234]

Sie haben durch die Register gehen.

scroll top