1

64ビットモードでのアドレス計算に関するインテルのマニュアルを読みました。64 ビット モードの場合、デフォルトのアドレス サイズは 64 ビットです。問題の命令の前にアドレス サイズ オーバーライド プレフィックスがあると仮定すると、アドレス サイズは 32 ビットになります。

ここで、レジスタ番号 0 (rax/eax/ax ...) で指定されたアドレスを使用して、命令がメモリ オペランドをエンコードするとします。

CPUがeax値のみを見て内部的にゼロ拡張して「ネイティブ」64ビットアドレスを形成するのか、rax値全体を見て有効な32ビット範囲に切り捨てるのか、私が完全には理解していないこと(たとえば、raxには5Gbのようなものが含まれており、CPUはそれを最大32ビットアドレスにカットします)。

4

1 に答える 1

2

64 ビット プロセッサで 32 ビット アドレッシングが使用される場合、アドレス計算の結果は 32 ビットに切り捨てられ、次に 64 ビットにゼロ拡張されます。32 ビット アドレッシングは 32 ビット レジスタを使用するように定義されているため、RAX に 140000000h (5GB) が含まれている場合は、代わりに EAX の値 (40000000h) が使用されることに注意してください。これは実際には大きな違いはありませんが。

Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture から:

すべての 16 ビットおよび 32 ビット アドレス計算は、IA-32e モードでゼロ拡張され、64 ビット アドレスを形成します。アドレスの計算は、最初に現在のモード (64 ビット モードまたは互換モード) の有効なアドレス サイズに切り捨てられ、アドレス サイズのプレフィックスによって上書きされます。その結果は、フル 64 ビット アドレス幅にゼロ拡張されます。このため、互換モードで実行されている 16 ビットおよび 32 ビットのアプリケーションは、64 ビット モードの実効アドレスの下位 4 GB にしかアクセスできません。同様に、64 ビット モードで生成された 32 ビット アドレスは、64 ビット モードの有効アドレスの下位 4 GB にのみアクセスできます。

于 2015-05-17T19:38:25.107 に答える