Mein Professor für eingebettete Systeme bezeichnet die Speicherorte von Registern immer wieder als ihre jeweiligen "Adressen". Das verwirrt mich; Ich hatte immer den Eindruck, dass in keinem Mikroprozessor die CPU-Register keine Adressen haben, da sie sich nicht im Hauptspeicher befinden (sie befinden sich im Mikroprozessor selbst). Ich bin auch verwirrt darüber, worauf wir uns beziehen, wenn wir den "Speicherort des Registers" sagen - wieder ist es nicht im Hauptspeicher.
Warum beziehen wir uns auf die Positionen der CPU-Register durch "Adressen"? Haben alle / einige Register Adressen?
Ich dachte darüber nach und argumentierte, dass sie möglicherweise mit bestimmten Hauptspeicherorten "verbunden" sind, um den Zugriff auf die in den Registern gespeicherten Werte zu ermöglichen. Ist dies eine Speicherzuordnung, um diesen Gedanken zu erweitern?
Ich sollte auch hinzufügen, dass wir speziell mit dem LPC1768-Mikrocontroller von NXP arbeiten, der den ARM Cortex-M3-Mikroprozessor verwendet.
quelle
Die Quelle der Verwirrung ist, dass es (im Allgemeinen) zwei Arten von Dingen gibt, die als "Register" bezeichnet werden können.
Das erste ist wahrscheinlich das, mit dem Sie vertraut sind: In ARM sind es Register
R0, R1, R2, ... R12, SP, LR, PC
und in x86eax, ebx, ecx, edx, ebp
und so weiter. Diese können auch als " Kernregister " oder " Prozessorregister " bezeichnet werden. Sie haben keine Adressen im Systemspeicher und können nur über bestimmte Anweisungen aufgerufen werden.Das andere sind die Register, die verschiedene Hardwareblöcke (Peripheriegeräte) in der CPU selbst oder außerhalb der CPU steuern können. Auf LPC1768 und vielen anderen eingebetteten Prozessoren sind sie normalerweise speicherabgebildet, und deshalb haben sie Adressen. Zum Beispiel befindet sich der UART0-Block unter der Adresse 0x4000C000 und dort müssen Sie lesen oder schreiben, um mit ihm zu kommunizieren. Zur Unterscheidung von den Kernregistern können sie als " Peripherieregister " oder " Hardwareregister " bezeichnet werden.
Auf einigen Low-End-8-Bit-Mikrocontrollern wie 8051 oder PIC gibt es möglicherweise überhaupt keine Kernregister außer vielleicht einem Akkumulator, und alle anderen Register werden in verschiedene Speicherbereiche wie "internes RAM" (zur temporären Speicherung / Berechnung) oder abgebildet Speicher "Special Function Registers" (SFR) für die Steuer- und Peripherieregister. In ihnen haben "Register" fast immer eine Adresse.
Größere ARMs haben auch Coprozessorregister , mit denen verschiedene Kernfunktionen (z. B. MMU oder Cache) mit Anweisungen wie
MRC
oder gesteuert werden könnenMCR
. Diese Register sind den Kernregistern insofern ähnlich, als sie keine Speicheradresse, sondern nur eine Nummer haben.Unter x86 können Sie auch über E / A- Ports verfügen , auf die über Anweisungen zugegriffen werden kann
in
undout
mit denen einige Hardwareblöcke gesteuert werden können. Diese haben eine ähnliche Funktion wie die Peripherieregister, werden jedoch normalerweise nicht als solche bezeichnet.quelle
register field
des Opcodes (das Maschinencode - Befehlswort), und können nicht verwechselt werden mit Speicheradressen (ihre Positionen in dem Opcode - Format unterscheiden und die Felder sind unterschiedlich groß).Sie haben Recht, dass sich einige Register nicht im Hauptspeicher befinden, sondern im Mikroprozessor selbst, und dass diese Register bestimmten Speicherplätzen zugeordnet sind.
Der LPC1768-Mikrocontroller verfügt nur über 64 KB RAM (was Sie unter Hauptspeicher verstehen), jedoch über einen 32-Bit-Adressbus und 4 GB Gesamtadressraum. Der Rest dieses Adressraums enthält den Flash-Speicher, in dem Ihr Programm gespeichert ist, und die Register für alle Peripheriegeräte (z. B. die Ausgangs-Pin-Zustände oder den ADC).
Wenn Sie versuchen, auf einen Speicherplatz zuzugreifen, erkennt die Logik im Mikrocontroller in der Regel, wo sich die Speicheradresse physisch befindet, und betreibt Steuerleitungen, damit die Daten dort ankommen, wo sie beabsichtigt waren, unabhängig davon, ob sie sich im RAM befinden. A. GPIO-Port oder ein Peripheriesteuerregister.
Dies vereinfacht das Schreiben von Software, da Sie sich nicht zu viele Gedanken darüber machen müssen, wo sich die Register physisch befinden, und das Kompilieren von übergeordneten Sprachen (wie C) erheblich vereinfacht.
Im speziellen Fall des LPC1768 sehen wir im Datenblatt ( http://www.nxp.com/documents/data_sheet/LPC1769_68_67_66_65_64_63.pdf ) die Adresskarte auf Seite 20 (Abbildung 4), in der alle aufgeführt sind Peripheriegeräte werden im Speicher zugeordnet.
Natürlich enthält der Prozessor auch eine Handvoll interner Register, die nicht speicherabgebildet sind. Auf diese kann viel schneller zugegriffen werden als auf alles andere im Adressraum, da die Speicherverwaltungslogik im Vergleich zum Kern langsam ist und als temporärer Speicher verwendet wird während des Betriebs. Ein Teil der Aufgabe eines Compilers besteht darin, Daten in Registern zu speichern und für Sie aus dem / in den Speicher zu verschieben.
quelle
Wie andere gesagt haben, hängt es von der Mikrocontroller-Familie ab. Und es kommt darauf an, was Sie unter Registrierung verstehen.
Der msp430 verfügt beispielsweise über zwei Sätze von "Registern". Die erste ist die RISC-Registerdatei mit 16 16-Bit-Registern. Dazu gehören die Register Programmzähler, Stapelzeiger, Status und Konstanter Generator sowie 12 allgemein verwendete Register. Dies sind Register in der traditionellen Architektur, in der das Wort verwendet wird.
Der zweite Registersatz ist alles andere. Ports, Peripheriegeräte, Interrupts usw. Diese sind Teil der einzelnen Speicherdatei und teilen sich den Speicherplatz mit dem allgemein verwendeten RAM und Flash (Code Space).
Zum Beispiel hat der msp430g2231 ein Port 1-Ausgangsregister an der Speicheradresse 0x21.
Sie können mit dem Registernamen p1out auf das Register zugreifen, dies ist jedoch nur ein Zeiger auf die 8-Bit-Speicheradresse 0x21. Am wichtigsten ist, dass der Compiler das so sieht. Die Header-Datei, in diesem Fall msp430g2231.h, definiert "p1out" als 0x0021. Abgesehen von der RISC-Registerdatei bedeutet die übliche Verwendung von Register lediglich eine Speicheradresse für eine x-spezifische Option. Was Sie als Register p1out sehen, ist nur die Art und Weise, wie eine höhere Sprache das Programmieren erleichtert, anstatt Speicherkarten zu speichern.
Wenn Sie einen Zeiger auf die Speicheradresse 0x27f verwenden, lesen Sie stattdessen aus dem RAM. Zeiger auf die Speicheradresse 0xffdf, und Sie würden stattdessen Ihren kompilierten Code lesen. Alles, was ein Register ist, ist eine Speicheradresse für eine spezielle Funktion.
quelle
Als Oberbegriff bedeutet "registrieren" nur einen Ort, an dem Sie Informationen speichern ("registrieren") können, nicht mehr.
Die meisten Architekturen reservieren das Termregister für Positionen innerhalb der CPU, die durch Bits in einem Befehl identifiziert werden und auf die häufig viel schneller zugegriffen werden kann als der allgemeine Massenspeicher ("RAM"). (Und oft kann in einem Ausführungszyklus parallel auf 2 oder 3 Register zugegriffen werden.)
In der Microchip PIC-Dokumentation werden jedoch alle adressierbaren Stellen als Register bezeichnet, auch einschließlich RAM. Wenn Ihr Professor diese Verwendung des Begriffs kopiert, sollte er Sie IMO darüber informieren, dass der Begriff "Register" heutzutage nicht mehr so verwendet wird. (Wie ich hoffe, dass ich es in meinen PIC-Assembler-Klassen getan habe.)
quelle
Register haben Adressen, obwohl sie sich im Allgemeinen nicht im Speicher befinden.
Denken Sie eine Minute darüber nach: Eine Adresse bezeichnet einen Ort in einem Raum, an dem der Speicher nur eine Instanz eines Raums ist. E / A hat oft einen eigenen Adressraum. In einigen Mikrocontroller-Architekturen sind Codespeicher und Datenspeicher separate Räume.
Und so können Register auch ihren eigenen Speicherplatz haben: Manchmal haben FP- und Integer-Register (und beim 68000, glaube ich, Adressregister) jeweils einen eigenen Speicherplatz.
Eine Frage ist: Wie können wir feststellen, ob sich Adresse 1 auf Byte 1 im Speicher, E / A-Port 1 oder Register 1 bezieht? Normalerweise aus dem Kontext: in einem IN- oder OUT-Befehl offensichtlich ein Port. In einem Register-zu-Register-Befehl ist es eine Registeradresse. In einem Ladebefehl gibt es eine (große) Speicheradresse und eine (kleine) Registeradresse und so weiter.
In einem ARM-Kern ist eine Speicheradresse normalerweise eine 32-Bit-Zahl. Eine Registeradresse ist eine 5-Bit-Nummer.
quelle
Wenn man eine Adresse als einen Satz von
k
Bits definiert, die verwendet werden können, um ein Element aus einem Satz von bis zu2^k
Elementen auszuwählen , dann ist es üblich, dass viele Register in vielen Prozessoren und Controllern Adressen haben, aber auch, dass Controller einige haben Register, die von Schaltkreisen abgetastet werden, die bestimmte Bedingungen erkennen und über keine Adresse identifizierbar sind. Es ist jedoch wichtig zu beachten, dass in vielen Fällen die Adressdrähte, die CPU-Register steuern, keine Beziehung zu den Adressdrähten haben, die mit größeren Speichersystemen verbunden sind. Daher existieren Register- "Adressen" häufig in einem völlig getrennten "Universum" von Speicheradressen.Auf den meisten Prozessoren werden Register- "Adressen" immer entweder intern von der Prozessorlogik außerhalb der Steuerung des Programmiergeräts generiert oder von bestimmten Bits in jedem Befehl abgerufen. Die einzige Möglichkeit, durch Ändern des Codes unter Software zu beeinflussen, welches Register von einem bestimmten Befehl abgerufen werden soll, besteht darin, die entsprechenden Bits innerhalb dieses Befehls zu patchen. Auf dem General Instruments PIC, dessen Design in Form des Microchip PIC weiterlebt, würde Hardware, wenn ein Opcode alle Nullen für eine Adresse spezifiziert, den Inhalt eines anderen Registers ersetzen, das sich an Adresse 3 befindet. Dies ermöglicht es dem Code, Berechnungen zur Auswahl zu verwenden eine Adresse.
Das vielleicht wichtigste Verständnis von Adressen ist, dass ein System unterschiedliche Adressräume haben kann, die effektiv in verschiedenen Universen existieren. Auf dem 8051 gibt es zum Beispiel, je nachdem wie man zählt, mindestens vier verschiedene Adressräume und möglicherweise bis zu sechs; vier von ihnen sind völlig unabhängig (die Anweisungen:
Alle rufen Daten von "Adresse 80h" ab, lesen jedoch vier nicht miteinander verbundene Dinge: eine Adresse im E / A-Bereich (das Datenregister von Port 0, glaube ich), das interne Datenregister 80h, den Codespeicher unter der Adresse 0x0080 und den externen Datenspeicher unter der Adresse 0x0080 . In vielen Systemen hätten diese Dinge tatsächlich keinerlei Beziehung zueinander. Die Tatsache, dass ein Register auf eine bestimmte Adresse in einem Universum reagiert, sagt wenig oder gar nichts darüber aus, ob es auf diese oder eine andere Adresse in einem anderen Universum reagiert.
quelle
RISC bedeutet "Reduced Instruction Set Computer". Ein Teil der Art und Weise, wie Sie die Größe des Befehlssatzes reduzieren, besteht darin, nur eine Art von Datenort zu haben, der Register, RAM oder E / A enthält.
Als die Leute diese Ideen ernst nahmen, waren die beiden erwarteten Vorteile von RISC-Designs, dass Sie den Prozessor viel schneller machen könnten, wenn Sie ihn viel einfacher machen würden, und dass Sie Ihren Programmcode optimieren könnten, wenn Sie eine Speicheradresse für irgendetwas verwenden könnten. Anstatt alles zum Laden und Entladen zu zwingen, wird das ALU-Register für Arithmetik, das Speicheradressregister für Speicheradressierung usw. durchlaufen.
Zwei Überreste dieser Denkweise sind: (1) Wir haben Prozessoren, die vortäuschen, dass alle Register gleich sind, indem sie Register in den Speicherraum abbilden, und (2) wir haben Professoren, die vortäuschen, dass alle Register gleich sind, indem sie Registerspeicherorte aufrufen.
Sei tolerant. Es war ein wichtiges Forschungsgebiet für Doktoranden, das einen signifikanten und dauerhaften Einfluss auf die Gestaltung einiger Prozessoren hatte.
quelle
Der 8051, wenn ich mich recht erinnere, könnte über Speicheradressen auf die Register zugreifen, aber dies ist nicht bei allen Prozessoren der Fall. Die ARM-Prozessoren haben dazu keine Möglichkeit, auf die Allzweckregister r0-r15 kann auf dem Speicherbus nicht zugegriffen werden.
quelle