FWORD データ型は 6 バイトとして定義されているため、jmp 命令でどのように 32 ビット仮想アドレスに変換されますか。
jmp FWORD PTR [eax-0x67]
?...
FWORD PTR にジャンプするとき、実行しているのは「ファー ジャンプ」です。つまり、指しているメモリには 16 ビットの「セレクタ」が含まれています (これは、GDT または LDT のいずれかのセグメント エントリを参照します)。 )、およびセレクターが参照するセグメントの先頭からの 32 ビット オフセット。セグメント記述子には、もちろん、セグメントに関するデータが含まれています...メモリ内のどこから始まるかを含みます。
ジャンプ中に、CPU はいくつかの権限チェックを行ってセレクターが有効で許可されていることを確認し (権限レベルやセグメント タイプなどが関係します)、最初の 16 ビットを CS に効果的にロードし、残りを EIP にロードします。それ以降は、コード アドレスに CS セグメントのベース アドレスが効果的に追加され、仮想アドレスに変換されます。
ファー ジャンプは完全なセグメント base:offset 値を絶対アドレスとして使用するため、16 ビット セグメントと 32 ビット アドレスから構成されます。現在のコード セグメントとは異なるセグメントにある命令へのジャンプを実行しますが、同じ特権レベルである必要があります。