2016-05-25 9 views
-2

ADD (const, Speicher) ist das schmutzigste aller sieht diese Codesequenz in etwa wie folgt:warum EIP aktualisiert wird, wenn Zugriffsspeicher oprand

• Holt den Befehl Byte aus dem Speicher.

• EIP aktualisieren, um auf das nächste Byte zu zeigen.

• Dekodieren Sie die Anweisung.

• bei Bedarf eine Verschiebung für den Einsatz in der effektiven Adressenberechnung fetch

• Wenn EIP Bedarf aktualisiert über den Verschiebungswert zu zeigen.

• Den konstanten Wert aus dem Speicher abrufen und an die ALU senden.

• Aktualisieren Sie EIP so, dass es über den Wert der Konstanten hinausgeht (bei der nächsten Anweisung im Speicher).

• Den Wert des Quelloperanden aus dem Speicher abrufen und an die ALU senden.

• Weisen Sie die ALU an, die Werte hinzuzufügen.

• Speichern Sie das Ergebnis zurück in den Speicheroperanden.

• Aktualisieren Sie das Flagsregister mit dem Ergebnis der Additionsoperation.

Dies ist aus dem The Art of Assembly Language Buch. Warum wurde der EIP 2 mal 3 mal aktualisiert?

+1

Wenn Sie Befehle mit variabler Länge haben, wie das x86, müssen Sie es zuerst dekodieren, um die Länge bestimmen zu können. –

Antwort

0

Sie können niemals beobachten, dass EIP in die Mitte einer dekodierten Anweisung zeigt. Das ist nur die Schreibweise des Autors. Echte Hardware decodiert offensichtlich nicht in einem langsamen iterativen Prozess, da es Hardware ist, keine Software.

x86 ist kompliziert zu dekodieren, und die Operandengröße Präfixe auch die Länge der im Fall von Opcodes des BefehlsRest ändern, die ein 16 oder 32-Bit-Sofortoperanden in Abhängigkeit von Größe nehmen. Intel-CPUs blockieren dies tatsächlich bei der Decodierung. (Es heißt ein LCP Stall).

Diese Notation klingt jedoch seltsam, da der Opcode mit variabler Länge die Länge des Befehls + unmittelbar voraussetzt. Die Decodierung des Präfixes + Opcode gibt Ihnen die Gesamtlänge des Befehls an, mit Ausnahme des Adressierungsmodus, der möglicherweise ein SIB-Byte und/oder eine Verschiebung aufweist.

Verwandte Themen