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; nop
Codierung 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 0x90
und ü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 NOP
Anweisung tun soll. Die CPU muss immer noch den 0x90
Operationscode abrufen, aber die Auswertung bewirkt im Wesentlichen nichts.