さて、私は AMD64 のマニュアルを読んでいて、 がnop
実際には であることを知りxchg eax, eax
、 を見てxchg
、レジスタを指定するための命令にバイトをエンコードできるという興味深い事実を発見しました (iPod を使っているので申し訳ありません)。写真。
そこで私が疑問に思うのは、プロセッサはどのようにして処理すべきバイトがあるかどうかを知るのか、それともその追加レジスタがrAX
実際には1バイトのままであるようにするタイプである必要があるのかということです。0x90
答え1
xchgを見ていて興味深いことが分かりました。レジスタを指定するための命令にバイトをエンコードできるようです。
はい、ほとんどの x86 命令はこのように動作します。命令は、一度にバイト単位ではなく、一度に 32 ビットまたは 64 ビット (マシンのワード長) 単位でフェッチされます。
XCHG
の( 32 ビット マシンでは、64 ビット マシンでは )を指定すると になりますrAX
。これは、 のレジスタ MUX コードが(実質的には が何も行わない 1 サイクルの操作)であるためです。同様に、命令は(のMUX コードは)にアセンブルされます。rAX
rAX
EAX
RAX
0x90
rAX
0x00
XCHG rBX, rAX
0x93
rBX
0b011
オペコードのエンコーディングはマニュアルのどこかに記載されているはずです。または、x86オペコードマップ(すべてがどのように多重化されているかを理解するのに役立ちます)を参照することもできます。Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル(第2巻、付録A.3)。
そこで私が疑問に思うのは、プロセッサはその後に処理すべきバイトがあるかどうかをどうやって知るのか、それともその追加レジスタはrAX型である必要があるため、実際には1バイト0x90のままなのかということです。
ここでは逆です。64ビットモードでは、実際には接頭辞命令語自体に (REX
プレフィックス ) が含まれていることを示します。プロセッサはプレフィックスの有無に基づいて何を探すべきかを認識します。プレフィックスREX
がない場合、命令は のままです0x90
。