x86-Programmierung und -Betriebsarten (Teil 1)

Beispiele

Beispiel: Der Wert des Codesegments CS lautet 24D5, der Wert des Befehlszählers 0108. Der nächste Befehl befindet sich damit bei der Adresse 24D5:0108. Der Code an dieser Adresse lautet 8CC0. Die Steuereinheit CU dekodiert diesen Code und ermittelt den Befehl

MOV EAX, ES

Es soll also der Wert des Extrasegments ES in das 32-Bit-Akkumulatorregister EAX übertragen werden. Nach der Ausführung des Befehls wird der Wert des Befehlszählers um zwei erhöht, da MOV EAX, ES ein Zwei-Byte-Befehl war. Der Wert von EIP lautet somit 10a0, der Wert des Codesegments CS bleibt unverändert.

Beispiel: Der Wert des Codesegments CS lautet 80B8, der Wert des Befehlszählers 019D. Der nächste Befehl befindet sich damit bei der Adresse 80B8:019D. Der Code an dieser Adresse lautet 7506. Die Steuereinheit CU dekodiert diesen Code und ermittelt den Befehl

JNZ 01A5

Es handelt sich also um eine bedingte Verzweigung (Jump if Not Zero) zum Befehl bei der Adresse 01A5. Das Codesegment wird dabei auf keinen Fall verändert. Für solche bedingten Verzweigungen ist das Flagregister von großer Bedeutung. Einer bedingten Verzweigung geht üblicherweise ein Vergleich zwischen zwei Werten voraus. Entsprechend dem Vergleichsergebnis werden bestimmte Flags im Flagregister gesetzt oder gelöscht. Hat der Vergleich zu einem "ungleich Null" geführt, so wird verzweigt: Der Befehlszähler EIP wird mit dem Wert 01A5 geladen. Somit setzt der Prozessor die Arbeit bei 80B8:01A5 fort. Führte der Vergleich zu einem "gleich Null", so findet keine Verzweigung statt, der Befehlsstrom wird gleichmäßig fortgesetzt. Hierzu wird EIP um zwei auf 019F erhöht, da es sich um einen Zwei-Byte-Befehl handelte.