Maschinensprache i8086/ CPU-Register
Theorie:
Einleitung – Maschinensprache –
Assembler – Zahlensysteme –
RAM-Adressen – BWS – Debug –
CPU-Register – Einfache Befehle – Stringbefehle – Interrupts –
I/O-Ports
Versuch:
BWS1 – BWS2 –
Hallo Welt – Bootsektor – MBR
Nützlich:
Befehlsliste – PAUSE – Filter
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]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
Der 80386er CPU ist ein echter 32-Bit-Prozessor: Er verfügt über 32-Bit-Register und einen 32-Bit-Adressbus. Damit kann er 2 hoch 32 Byte = 4 Gigabyte Speicher adressieren.
Die 32-Bit-Register heißen EAX, EBX, ECX, EDX, ESI, EDI und EBP. Auch das Befehlsregister EIP hat 32 Bit. Wenn Sie die Bezeichnungen AX, BX usw. wählen, werden nur die unteren 16 Bit des entsprechenden 32-Bit-Registers benutzt.
Die Register GS und FS sind neu: Es sind 16-Bit-Segmentregister.
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
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
Anhang
[Bearbeiten]Warum ist das so kompliziert? Warum hat jedes Register eine andere Funktion?