„nop; jmp kurz“ vs. „jmp kurz; nop“

„nop; jmp kurz“ vs. „jmp kurz; nop“

Ok, lassen Sie mich zunächst Folgendes klarstellen: Es geht hier nicht um Mikrooptimierung.

Aber ich weiß, dass viele Bootloader auf der Partition die jmp short; nopCodierung verwenden. Aber meines Wissens nach ist es so, dass der Prozessor weniger Zyklen benötigt, um einen JMP abzuschließen, je weniger „Sprünge“ er macht :), und manche Prozessoren sehen das 0x90und überspringen es einfach, ohne es auszuwerten.

Antwort1

Vielleicht möchten Sie einen Blick auf dieSoftwareentwicklerhandbücher für die Intel 64- und IA-32-Architekturen, sie sind eine großartige Ressource, um die x86-Architektur aus der Sicht eines Programmierers zu verstehen (vorausgesetzt, Sie sind bereits mit Assembler vertraut).

[...] meines Wissens nach ist es so, dass je weniger ein JMP "springt" :), desto weniger Zyklen benötigt der Prozessor zum Abschließen

Sie müssen zwischen Nah- und Fernsprüngen unterscheiden. Nahsprünge addieren einfach einen Offset zum Befehlszeiger (IP) (oder subtrahieren ihn über die Zweierkomplement-Mathematik) oder laden den IP-Offset aus dem aktuellen Codesegment (CS) neu. Nahsprünge können den Offset häufig im Befehlswort selbst oder in einem Register speichern, sodass der gesamte Sprungbefehl in einem Zyklus abgerufen werden kann.

Weite Sprünge speichern die tatsächliche neue Adresse des Befehlszeigers imnächsteWort oder in einem Speicherort, so dass dies einen zusätzlichen Abruf erfordert - und somit länger dauert. Auf x86 und x86-64 können SienichtWeitsprung zu einer in einem Register gehaltenen Position (es muss das nächste Befehlswort oder eine Position im Speicher sein).

und einige Prozessoren sehen 0x90 und überspringen es einfach, ohne es auszuwerten.

Ja, das ist die Definition dessen, was eine NOPAnweisung tun soll. Die CPU muss immer noch den 0x90Operationscode abrufen, aber die Auswertung bewirkt im Wesentlichen nichts.

verwandte Informationen