NOPバイトの理解

NOPバイトの理解

さて、私は AMD64 のマニュアルを読んでいて、 がnop実際には であることを知りxchg eax, eax、 を見てxchg、レジスタを指定するための命令にバイトをエンコードできるという興味深い事実を発見しました (iPod を使っているので申し訳ありません)。写真

そこで私が疑問に思うのは、プロセッサはどのようにして処理すべきバイトがあるかどうかを知るのか、それともその追加レジスタがrAX実際には1バイトのままであるようにするタイプである必要があるのか​​ということです。0x90

答え1

xchgを見ていて興味深いことが分かりました。レジスタを指定するための命令にバイトをエンコードできるようです。

はい、ほとんどの x86 命令はこのように動作します。命令は、一度にバイト単位ではなく、一度に 32 ビットまたは 64 ビット (マシンのワード長) 単位でフェッチされます。

XCHGの( 32 ビット マシンでは、64 ビット マシンでは )を指定すると になりますrAX。これは、 のレジスタ MUX コードが(実質的には が何も行わない 1 サイクルの操作)であるためです。同様に、命令は(のMUX コードは)にアセンブルされます。rAXrAXEAXRAX0x90rAX0x00XCHG rBX, rAX0x93rBX0b011

オペコードのエンコーディングはマニュアルのどこかに記載されているはずです。または、x86オペコードマップ(すべてがどのように多重化されているかを理解するのに役立ちます)を参照することもできます。Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル(第2巻、付録A.3)。

そこで私が疑問に思うのは、プロセッサはその後に処理すべきバイトがあるかどうかをどうやって知るのか、それともその追加レジスタはrAX型である必要があるため、実際には1バイト0x90のままなのかということです。

ここでは逆です。64ビットモードでは、実際には接頭辞命令語自体に (REXプレフィックス ) が含まれていることを示します。プロセッサはプレフィックスの有無に基づいて何を探すべきかを認識します。プレフィックスREXがない場合、命令は のままです0x90

関連情報