アセンブリでCLRコードをデバッグしていて、
mov rax, qword ptr [ff4053c0h]
qword ptr [ff4053c0h]
は興味のある文字列を参照していると思いますが、ff4053c0h
は有効なメモリ位置ではありません。 qword ptr
について読むと、ベースレジスタに基づいてアドレスを参照しているようです(たとえば、qword ptr [rsp+30h]
はスタックに30バイトあります)が、ベースレジスタがないと意味がわかりません。
ベースレジスタが提供されていない場合、それはdata segment
( http://www.osdata.com/system/physical /memory.htm )。コードでは、mov rax, qword ptr [ff4053c0h]
は「データセグメントオフセットFF4053C0hから8バイトを取得し、それらをRAXに配置する」ことを意味します。
正しく指しているので、rsp
のようなベースレジスタの存在は、スタックセグメントを明確に示しています。あなたの場合、ベースレジスタがないということはデータセグメントを意味します。
さて、「4 282 405 824」である大きな数「FF4053C0h」については、4Gbのアドレス可能なメモリ( http://wiki.osdev.org/Protected_Mode )を持つことは完全に可能です。コード行が有効であり、巨大なデータセグメントのオフセットFF4053C0hにアクセスしていることを確認します( http://www.ece.unm.edu/~jimp/310/slides/micro_Arch2.html ) 。
別のソース= アセンブリ:データセグメントレジスタ(DS)の使用 。
正当な理由もなく物事を複雑にすることなく:
64ビット値がアドレス0ff4053c0h
からレジスタRAX
に読み込まれることを意味します。
アドレスは有効である必要があります。もう一度確認してください。QWORD PTR
は単なるサイズ指定子であり(ここでは冗長ですが、読みやすさが向上します)、ベースレジスタを持つこととは関係ありません。
CPUのさまざまなアドレッシングモードに本当に興味がある場合は、Intelのマニュアル(Google that)を読むことができます。
64ビット値をメモリからraxレジスタに移動しています。値はアドレスff4053c0hから読み取られます。 qword ptrは、アセンブラが64ビット定数アドレスを使用して移動オペコード(マシンコード)を作成するためのヒントです。提供される値は32ビット値です(8桁の16進数=> 16進数/文字の8倍=> 8 * 4ビット=> 32ビット)。
32ビット操作をサポートするが(CPU /モードの仕様を確認する可能性が高い)64ビットレジスタにメモリをロードしない移動オペコードがあります。したがって、64ビットアドレスを本当に表現したいアセンブラを確保するには、qwordが必要です。
未定義のメモリを指すアドレスについてのコメント(受け入れられた回答についてはコメントを参照)については、現在、すべてのプロセスに仮想メモリテーブルが割り当てられていることを理解してください。仮想メモリは基本的に、論理アドレスを実メモリ内のアドレスにマップします。これにより、プロセスがプロセスに属していないメモリを認識および変更するのを防ぎ、実行中のシステムに大きな安定性を提供します。
2つのプロセスが両方ともメモリの一部を共有しているため、個々のプロセスが異なる論理アドレスにあるまったく同じ物理メモリを参照する可能性があります。オペレーティングシステムは、各プロセスの仮想メモリがどのように見えるかを決定します。
マッピングはページレベル(例:page = 4KB)ごとに提供され、プロセッサは実際のマッピングを内部で行います。
この概念は、ファイルをメモリにマッピングし、異なるプロセス間でメモリを共有する場合に非常に当てはまります。このようにして、2GBのファイルをメモリにマップし、(最大で)2GBの実際のメモリのみが消費される一方で、10個のプロセスがまったく同じマップされたファイルを同時に処理することができます。これは、ファイルのIOキャッシングが主にOSレベルで行われる方法です。