Maschinensprache i8086/ CPU-Register

Theorie:  EinleitungMaschinenspracheAssemblerZahlensystemeRAM-AdressenBWSDebugCPU-RegisterEinfache BefehleStringbefehleInterruptsI/O-Ports
Versuch:  BWS1BWS2Hallo WeltBootsektorMBR
Nützlich: BefehlslistePAUSEFilter
Analyse:  Bootloader


Die Register des i8086

Bearbeiten

Die folgende Beschreibung bezieht sich auf den Intel Prozessor i8086. Der Prozessor i8088 hat extern nur 8 Bit, ist jedoch intern baugleich. Darum ist im folgenden nur vom i8086 die Rede.

Dieser Prozessor hat einen Befehlssatz von mehr als 100 Befehlen und verfügt über 14 Register zu je 16 Bit.

Alle nachfolgenden Intel-80x86-Prozessoren haben die gleichen Befehle und Register – plus zusätzliche Befehle und Eigenschaften, aber jeder Prozessor startet im sogenannten "Real Mode", in welchem sich jeder Prozessor wie ein i8086 verhält. Diese Abwärtskompatibilität hatte sich IBM einst von Intel vertraglich zusichern lassen, bevor Intel den Vertrag zur Lieferung von i8088-Prozessoren für den IBM PC erhielt.

Das Betriebssystem (außer DOS) schaltet den Prozessor sehr bald in den sogenannten „Protected Mode“, weil nur in diesem Modus der RAM oberhalb 1 MB sowie Speicherschutzmechanismen existieren.

Bei Bedarf (z. B. wenn man ein DOS-Fenster öffnet) kann der Prozessor zurück in den "Real Mode" geschaltet werden.

Die „intel-kompatiblen“ Prozessoren aller anderen Hersteller haben die gleichen Register und Befehle, manchmal noch ein paar zusätzliche.

Was sind die "Register" des Prozessors?

Bearbeiten
 
Registersatz der 8088/86-CPU

Speicherplätze im Hauptspeicher (RAM) werden mit Nummern (Adressen) bezeichnet. Alle Hauptspeicher-Plätze haben identische Eigenschaften.

Auch im Inneren des Prozessors gibt es Speicherplätze: 14 Register zu je 16 Bit. Die Speicherplätze im Prozessor werden nicht mit Nummern, sondern zur besseren „Merkbarkeit“ mit symbolischen Namen bezeichnet.

Jedes Prozessorregister kann mit entsprechenden Befehlen beschrieben und gelesen werden. Anders als die RAM-Speicherplätze hat aber jedes Register zusätzliche, jeweils verschiedene Verbindungen zu anderen Teilen des Prozessors, und damit verschiedene Besonderheiten. Die 14 Register werden in drei Funktionsgruppen gegliedert:

Allgemeine Daten- und Arithmetik-Register AX BX CX DX BP SP DI SI
Steuer- und Status-Register IP F
Segment- bzw. Adress-Register CS DS SS ES

Allgemeine Daten- und Arithmetik-Register

Bearbeiten

Die Register AX, BX, CX und DX sind jeweils 16 Bit breit. Bei Bedarf können diese Register in einen High und Low Teil zu je 8 Bit geteilt werden, wobei beide Registerteile auch einzeln adressierbar sind.

Jedes dieser Mehrzweckregister hat noch eine spezielle Funktion:

AX = AH + AL           Akkumulator bei bestimmten arithmetischen Operationen
BX = BH + BL           Basisregister
CX = CH + CL           Counter (Zählregister)
DX = DH + DL           Datenregister für Eingabe-/Ausgabeoperationen

Die folgenden 16-Bit-Register können nicht geteilt werden:

BP  Base Pointer       Basisregister
SP  Stack Pointer      Zeiger auf Kellerspeicher
SI  Source Index       Indexregister für Quell-Operanden
DI  Destination Index  Indexregister für Ziel-Operanden

Besonderheit der Register SI und DI

Die Register SI und DI können automatisch inkrementiert (d. h. um einen festen Wert vergrößert) bzw. decrementiert werden. SI und DI werden implizit bei Stringverarbeitungsbefehlen verwendet.

Besonderheit der Register SI und DS

Das Registerpaar DS:SI adressiert stets einen Speicherplatz im Datensegment, wenn im Programm nichts Gegenteiliges angegeben wird.

Besonderheit der Register DI und ES

Das Registerpaar ES:DI adressiert stets einen Speicherplatz im Extrasegment, wenn im Programm nichts Gegenteiliges angegeben wird.

Besonderheit der Register SP und BP

Der Stack (deutsch: Kellerspeicher) in einem Computer ist ein Datenfeld, in dem temporäre Daten zwischengespeichert werden. Beim Stack handelt es sich um eine spezielle Datenablage, deren Funktionieren man am besten mit einem Stapel von Büchern vergleichen kann. Beim Füllen wird Buch für Buch aufeinandergelegt. Will man die Bücher wiederhaben, kann man sie nur eins nach dem anderen oben herunternehmen. Man spricht auch vom „LIFO“-Prinzip: „Last In – First Out“. Man kann zwar die Buchrücken des ganzen Stapels lesen, aber mitten aus dem Stapel kein Buch herausziehen.

Das Stack-Prinzip hat sich als besonders nützlich erwiesen, um bei Unterprogrammaufrufen die Rückkehradresse zu speichern und die Parameter zu übergeben. Weil durch das Unterprogramm meist die Inhalte der Prozessorregister verändert werden, ist es üblich, vor dem Unterprogramm-Aufruf die Register mit PUSH Befehlen auf den Stack zu sichern und später mit POP Befehlen die früheren Registerinhalte wiederherzustellen.

Das Register SP zeigt auf das aktuelle Ende des Stacks. Das Register SP wird automatisch verändert durch alle Befehle, die Daten im Stack ablegen bzw. entnehmen (z. B. PUSH, POP, CALL).

Das BP-Register bezieht sich ebenfalls auf das Stack-Segment. Das BP Register kann verwendet werden, um einen Speicherplatz im Stack zu markieren.

In mehreren Programmiersprachen wird der Stack auch für die Übergabe von Variablen an Unterprogramme verwendet. Außer den Registern werden die Variablen in den Stack geschoben.

Steuer- und Status-Register

Bearbeiten

Die Adresse des jeweils nächsten Befehles steht im IP-Register (im Code-Segment-Register steht die zugehörige Segment-Adresse):

IP  Instruction Pointer   Offset-Adresse für den nächsten Befehl
F   Flag Register         enthält Einzelbits wie z.B.
                            NZ   Non Zero
                            ZR   Zero
                            NC   Non Carry
                            CY   Carry
Das Flagregister des 80x86
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
_ _ _ Overflow Direction Interrupt Enable Trap/Single Step Sign Zero _ Auxiliary _ Parity _ Carry

Mit dem DOS-Programm DEBUG können Sie sich die Registerinhalte anzeigen lassen: Mit dem Befehl R erfolgt die Anzeige, z. B. mit R AX kann man den Inhalt des AX-Registers ansehen und ändern.

Segment- bzw. Adress-Register

Bearbeiten

Der 8086-Prozessor (und die 80x86-Prozessoren im Real Modus) kann maximal 1 MByte (2 hoch 20 = 1048576 Byte) physikalisch adressieren. Nun hat der Prozessor aber Adressregister, die nur 16 Bit groß sind . Mit 16 Adressbits lassen sich nur 64k Byte (2 hoch 16 = 65536 Byte) adressieren, ein sechzehntel des möglichen Speichers. Der 1 MByte Adressraum muss deshalb in Segmente zu je 64 k Byte geteilt werden.

Um den Datenbestand in einem bestimmten Segment erreichen zu können, muß zunächst das Segment voreingestellt werden.

Für die Speicherung der Segmentadressen sind die Register ES, SS, DS und CS vorgesehen. Da diese Register nur sehr selten verändert werden, gibt es nur wenige Befehle, um diese Register auszulesen oder neu zu laden. Deshalb wird meist der Umweg über das AX-Register genommen.

ES  Extra Segment      arbeitet implizit mit dem DI zusammen
SS  Stack Segment      arbeitet implizit mit dem SP zusammen
DS  Daten Segment      Segmentregister für alle anderen Daten
CS  Code Segment       Segmentregister für Befehle

Warum ist das so kompliziert? Warum hat jedes Register eine andere Funktion?