Suche…


Bemerkungen

Was sind Register?

Der Prozessor kann mit numerischen Werten (Zahlen) arbeiten, diese müssen jedoch erst irgendwo gespeichert werden. Die Daten werden meistens im Speicher oder innerhalb des Befehls-Opcodes (der normalerweise auch im Speicher gespeichert ist) oder in einem speziellen Speicher auf dem Chip gespeichert, der direkt im Prozessor abgelegt wird, der als Register bezeichnet wird .

Um mit value in register arbeiten zu können, müssen Sie ihn nicht nach Adresse adressieren, sondern spezielle "Namen" werden verwendet, wie zum Beispiel ax bei x86 oder A bei Z80 oder r0 bei ARM.

Einige Prozessoren sind so aufgebaut, dass fast alle Register gleich sind und für alle Zwecke verwendet werden können (häufig RISC-Prozessorgruppe), andere haben eine spezielle Spezialisierung, wenn nur einige Register für die Arithmetik ( "Akkumulator") bei frühen CPUs verwendet werden ) und andere Register nur zur Speicheradressierung usw.

Diese Konstruktion unter Verwendung von Speichern direkt auf dem Prozessorchip enorme Leistungs Implikation hat, das Hinzufügen von zwei Zahlen aus den Registern der Lagerung wird registrieren zurück in der Regel in kürzester Zeit durch diesen Prozessor (Beispiel auf ARM - Prozessor durchgeführt: ADD r2,r0,r1 setzt r2 bis (r0 + r1) Wert in einem einzigen Prozessorzyklus).

Wenn dagegen einer der Operanden auf einen Speicherplatz verweist, kann der Prozessor für einige Zeit stehen bleiben und darauf warten, dass der Wert vom Speicherchip ankommt (bei x86 kann dies von null bis zu Werten im L0-Cache bis zu Hunderten reichen) CPU-Zyklen, wenn sich der Wert in keinem Cache befindet und direkt aus dem Speicher-DRAM-Chip gelesen werden muss.

Wenn der Programmierer einen Datenverarbeitungscode erstellt, möchte er normalerweise alle Daten während der Verarbeitung in Registern haben, um die beste Leistung zu erzielen. Wenn dies nicht möglich ist und Lese- / Schreibvorgänge im Speicher erforderlich sind, sollten diese minimiert werden und ein Muster bilden, das mit der Cache- / Speicherarchitektur der jeweiligen Plattform zusammenarbeitet.

Die native Größe des Registers in Bits wird häufig verwendet, um Prozessoren zu gruppieren, z. B. Z80 ist "8-Bit-Prozessor" und 80386 ist "32-Bit-Prozessor" - obwohl diese Gruppierung selten eindeutig ist. Z80 arbeitet beispielsweise auch mit Registerpaaren und bildet einen nativen 16-Bit-Wert, und die 80- Bit-CPU mit 32-Bit- Werten verfügt über MMX-Befehle, um mit 64-Bit-Registern nativ zu arbeiten.

Zilog Z80 registriert sich

Register: 8 Bit: A , B , C , D , E , H , L , F , I , R , 16 Bit: SP , PC , IX , IY und Schatten einiger 8b Register: A' , B' , C' , D' , E' , H' , L' und F' .

Die meisten der 8-Bit-Register können auch paarweise als 16-Bit-Register verwendet werden: AF , BC , DE und HL .

SP ist ein Stapelzeiger , der die Unterseite des Stapelspeichers markiert (wird von PUSH / POP / CALL / RET Anweisungen verwendet).
PC ist ein Programmzähler , der auf die aktuell ausgeführte Anweisung zeigt.
I ist ein Interrupt-Register , das ein hohes Byte der Vektortabellenadresse für den Interrupt-Modus der IM 2 liefert.
R ist ein Refresh-Register , es wird jedes Mal inkrementiert, wenn die CPU einen Opcode (oder Opcode-Präfix) abruft.
Auf einigen Z80-Prozessoren gibt es einige inoffizielle Anweisungen, um 8-Bit-Teile von IX als IXH:IXL und IY als IYH:IYL .

Auf Schattenvarianten kann von keinem Befehl direkt zugegriffen werden, der Befehl EX AF,AF' zwischen AF und AF' , und der EXX Befehl tauscht BC,DE,HL mit BC',DE',HL' .


Wert in ein Register laden:

    ; from other register
    LD   I,A        ; copies value in A into I (8 bit)
    LD   BC,HL      ; copies value in HL into BC (16 bit)
    ; directly with value encoded in instruction machine code
    LD   B,d8       ; 8b value d8 into B
    LD   DE,d16     ; 16b value d16 into DE
    ; from a memory (ROM/RAM)
    LD   A,(HL)     ; value from memory addressed by HL into A
    LD   A,(a16)    ; value from memory with address a16 into A
    LD   HL,(a16)   ; 16b value from memory with address a16 into HL
    POP  IX         ; 16b value popped from stack into IX
    LD   A,(IY+a8)  ; IX and IY allows addressing with 8b offset
    ; from I/O port (for writing value at I/O port use "OUT")
    IN   A,(C)      ; reads I/O port C, value goes to A

Die richtigen Kombinationen möglicher Quell- und Zieloperanden sind begrenzt (z. B. LD H,(a16) ist nicht vorhanden).


Wert in einem Speicher speichern:

    LD   (HL),D     ; value D stored into memory addressed by HL
    LD   (a16),A    ; value A into memory with address a16
    LD   (a16),HL   ; value HL into 16b of memory with address a16
    LD   (IX+a8),d8 ; value d8 into memory at address IX+a8
    LD   (IY+a8),B  ; value B into memory at address IY+a8
    ; specials ;)
    PUSH DE         ; 16b value DE pushed to stack
    CALL a16        ; while primarily used for execution branching
      ; it also stores next instruction address into stack

x86-Register

In der 32-Bit-Welt fallen die Universalregister in drei allgemeine Klassen: die 16-Bit-Universalregister, die erweiterten 32-Bit-Universalregister und die 8-Bit-Registerhälften. Diese drei Klassen stellen überhaupt keine drei völlig unterschiedlichen Registersätze dar. Die 16-Bit- und 8-Bit-Register sind eigentlich Namen von Regionen innerhalb der 32-Bit-Register. Das Registerwachstum in der x86-CPU-Familie wurde durch die Erweiterung der in älteren CPUs vorhandenen Register erreicht

Es gibt acht 16-Bit-Universalregister: AX, BX, CX, DX, BP, SI, DI und SP; Sie können einen beliebigen Wert eingeben, der in 16 Bit oder weniger ausgedrückt werden kann.

Als Intel die x86-Architektur 1986 auf 32 Bit erweiterte, verdoppelte er die Größe aller acht Register und gab ihnen neue Namen, indem er vor jedem Registernamen ein E voranstellte. Dies führte zu EAX, EBX, ECX, EDX, EBP, ESI, EDI und ESP.

Mit x86_64 kam es zu einer weiteren Verdoppelung der Registergröße sowie zum Hinzufügen einiger neuer Register. Diese Register sind 64 Bit breit und werden benannt (Schrägstrich wird zur Anzeige des alternativen Registernamens verwendet): RAX / r0, RBX / r3, RCX / r1, RDX / r2, RBP / r5, RSI / r6, RDI / r7, RSP / r4 R8, R9, R10, R11, R12, R13, R14, R15.

Während die Allzweckregister technisch für alles verwendet werden können, hat jedes Register auch einen alternativen / Hauptzweck:

  • AX (Akkumulator) wird in arithmetischen Operationen verwendet.
  • CX (Zähler) wird in den Verschiebe- und Drehbefehlen und für Schleifen verwendet.
  • DX (Daten) wird in Arithmetik- und E / A-Operationen verwendet.
  • BX (Basis) wird als Zeiger auf Daten verwendet (insbesondere als Versatz zum DS-Segmentregister im segmentierten Modus).
  • SP (Stack) zeigt auf den Stack.
  • BP (Stack Base) zeigt auf die Basis des Stacks.
  • SI (Quelle) zeigt auf eine Quelle im Speicher für lodsb (z. B. lodsb ).
  • DI (destination) zeigt auf ein Ziel im Speicher für stosb (z. B. stosb ).

Segmentregister, die im segmentierten Modus verwendet werden, zeigen auf verschiedene Segmente im Speicher. Jedes 16-Bit-Segmentregister gibt 64 KB (16 Bit) Daten an. Nachdem ein Segmentregister so eingestellt wurde, dass es auf einen Speicherblock zeigt, können Register (wie BX , SI und DI ) als Offsets zum Segmentregister verwendet werden, sodass auf bestimmte Stellen im 64-k-Speicherplatz zugegriffen werden kann.

Die sechs Segmentregister und ihre Verwendung sind:

Registrieren Vollständiger Name Beschreibung
SS Stapelsegment Zeigt auf den Stapel
CS Codesegment Wird von der CPU verwendet, um den Code abzurufen
DS Datensegment Standardregister für MOV-Vorgänge
ES Zusätzliches Segment Zusätzliches Datensegment
FS Zusätzliches Segment Zusätzliches Datensegment
GS Zusätzliches Segment Zusätzliches Datensegment

x64-Register

Die x64-Architektur ist die Weiterentwicklung der älteren x86-Architektur, sie hat die Kompatibilität mit ihrem Vorgänger beibehalten (x86-Register sind noch verfügbar), führte jedoch auch neue Funktionen ein:

  • Register haben jetzt eine Kapazität von 64 Bit;
  • Es gibt 8 weitere Register für allgemeine Zwecke.
  • Segmentregister werden im 64-Bit-Modus auf 0 gesetzt;
  • Die unteren 32, 16 und 8 Bits jedes Registers sind jetzt verfügbar.

Allgemeiner Zweck

Registrieren Name Unterregister (Bits)
RAX Akkumulator EAX (32), AX (16), AH (8), AL (8)
RBX Base EBX (32), BX (16), BH (8), BL (8)
RCX Zähler ECX (32), CX (16), CH (8), CL (8)
RDX Daten EDX (32), DX (16), DH (8), DL (8)
RSI Quelle ESI (32), SI (16), SL (8)
RDI Ziel EDI (32), DI (16), DL (8)
RBP Basiszeiger EBP (32), BP (16), BPL (8)
RSP Stapelzeiger ESP (32), SP (16), SPL (8)
R8-R15 Neue Register R8D-R15D (32), R8W-R15W (16), R8B-R15B (8)

Hinweis

Die Suffixe zur Adressierung der unteren Bits der neuen Register stehen für:

  • B Byte, 8 Bit;
  • W Wort, 16 Bit;
  • D Doppelwort, 32 Bit.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow