x86-Programmierung und -Betriebsarten (Teil 1)

Codesegment und Befehlszähler

Im Kapitel 5 "Einstieg in die 32-Bit-Welt - Der 80386" des "PC Hardwarebuch" ist bereits erwähnt, dass der Prozessor zur Programmausführung Befehle aus dem Speicher holt (auch als Befehls-Fetching bezeichnet) und ausführt. Grundlage für dieses automatische Lesen bilden Codesegment und Befehlszähler. Das Codesegment gibt dabei (natürlich) das Segment an, aus dem der nächste Befehl gelesen werden soll. Der Befehlszähler ist der Offset des nächsten zu lesenden Befehls. Die Bezeichnung Befehlszähler hat historische Gründe. Das Paar Codesegment:Befehlszähler bildet somit die Adresse des nächsten auszuführenden Befehls im Speicher. Der Prozessor kann damit diesen Befehl einlesen und ausführen. Am Code des Befehls erkennt der Prozessor, wie viele Bytes er einlesen muss, damit sich der vollständige Befehl im Prozessor befindet. Befehle für den 80x86 sind zwischen einem und 15 Byte lang.

Ist der Befehl ausgeführt worden, so wird der Befehlszähler um die Zahl der Bytes inkrementiert, die der gerade ausgeführte Befehl aufwies. Bei einem kurzen 2-Byte-Befehl wird der Befehlszähler also um zwei erhöht, das Paar Codesegment:Befehlszähler verweist dann auf den nächsten auszuführenden Befehl. Dieser wird in gleicher Weise eingelesen und ausgeführt. Anschließend inkrementiert der Prozessor seinen Befehlszähler erneut. Dieses Einlesen und Inkrementieren führt der Mikroprozessor dabei völlig selbstständig aus, es ist kein Eingriff eines Steuerprogramms oder gar des Benutzers notwendig. Einmal "angestoßen", fährt die CPU damit ständig fort, Befehle einzulesen und auszuführen.

Für das Befehls-Fetching spielen Prefetch-Queue und Busschnittstelle eine wichtige Rolle. Befehle werden zuerst in die Prefetch-Queue eingelesen, die diese dann an die Befehlseinheit weitergibt. Sind in der Prefetch-Queue durch die ständige Weitergabe der Befehlsbytes an die Steuereinheit so viele Bytes frei geworden, wie der Breite des Prozessordatenbusses entspricht, dann liest die Busschnittstelle entsprechend viele Bytes aus dem Speicher in die Prefetch-Queue ein. Der 80386 beispielsweise besitzt einen Datenbus, der vier Byte (32 Bit) breit ist. Er liest also immer dann selbstständig vier Bytes ein, wenn in der Prefetch-Queue vier Byte frei sind. Dadurch nutzt der Prozessor den Datenbus in optimaler Weise: Wenn der 80386 gerade einen Befehl ausführt, der keinen unmittelbaren Speicherzugriff erfordert (z.B. die Addition zweier Register), kann die Busschnittstelle die Prefetch-Queue nachladen, ohne dass die Abarbeitung des gerade aktiven Befehls behindert wird. Damit steht sofort nach der Abarbeitung des gerade aktiven Befehls bereits der nächste Befehl zur Verfügung und muss nicht erst aus dem Speicher gelesen werden.