「nop; jmp short」と「jmp short; nop」

「nop; jmp short」と「jmp short; nop」

まず、はっきりさせておきたいのは、これはマイクロ最適化に関するものではないということです。

しかし、パーティション上のブートローダでは、コーディングが多数使用されていることは知っていますjmp short; nop。しかし、私の理解では、jmp の「ジャンプ」量が少ないほど、プロセッサが完了するまでのサイクル数が少なくなり、プロセッサによっては、 を見つけて0x90、評価せずにスキップするだけなのです。

答え1

ぜひご覧になってみてくださいIntel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアルこれらは、プログラマーの観点から x86 アーキテクチャを理解するための優れたリソースです (アセンブリ言語にすでに慣れていることを前提としています)。

[...] 私の理解では、jmp の「ジャンプ」量が少ないほど、プロセッサが完了するのにかかるサイクルが少なくなります。

ニアジャンプとファージャンプを区別する必要があります。ニアジャンプは、命令ポインタ (IP) にオフセットを追加する (または 2 の補数計算で減算する) か、現在のコードセグメント (CS) から IP オフセットを再ロードするだけです。ニアジャンプは、多くの場合、オフセットを命令ワード自体またはレジスタに格納できるため、ジャンプ命令全体を 1 サイクルでフェッチできます。

ファージャンプは命令ポインタの実際の新しいアドレスをワードまたはメモリ位置にあるため、追加のフェッチが必要になり、時間がかかります。x86およびx86-64では、ないレジスタに保持されている場所へのファージャンプ (次の命令ワードまたはメモリ内の場所である必要があります)。

一部のプロセッサは 0x90 を認識し、評価せずにスキップします。

NOPはい、それが命令が行うことの定義です。CPU は依然として0x90オペコードを取得する必要がありますが、評価は本質的には何も行いません。

関連情報