web-dev-qa-db-ja.com

アセンブリで「DS:[40207A]」とはどういう意味ですか?

0040103A   CALL DWORD PTR DS:[40207A]                USER32.MessageBoxA

DS:意味?

23
wamp

命令は、ds:[40207A]のメモリから新しいEIP値をロードしています。つまり、アドレス40207Aに関数ポインタがあります。 (これは単なるcallではなくjmpであるため、リターンアドレスをプッシュします。)

ds:は、命令がデータセグメント内のメモリを参照していることを意味します。フラットなアドレス空間モデルで実行されるため、最近のOSではほとんど無視できます(コード、データ、スタックセグメントはすべて同じメモリ範囲を参照します) 、およびメモリ保護はページングで処理されます)。

ds:は、それが間違いなくメモリオペランドであることを示し、使用するセグメントを通知するためにあります/セグメントオーバーライドプレフィックスがないことを示します(これはすでにデフォルトであるため、おそらくdsプレフィックスを除く) )。

編集:

少し詳しく説明します。簡単にするために、これはWindowsを実行している32ビットプロテクトモードのコンテキストであることに注意してください。

セグメントレジスタ(CS、DS、SS、ES、FS、GS)は、selectorを指すdescriptorを保持します。グローバル( [〜#〜] gdt [〜#〜] )とローカル( [〜#〜] ldt [〜#〜] )の2つの記述子テーブルがあります。セレクターには、どちらを使用するかを示すビットがあります。 Windows(ほぼ?)はグローバルテーブルのみを使用します。

記述子基本的にa{beginning-address、size}ペア-それだけではありませんが、それはこの投稿の範囲外です。

Windowsは フラットメモリモデル を使用します。各プロセスにはメモリアドレス0から始まる4GBのアドレス空間があり、 ページング を使用してプロセスを相互に分離します。

プロセスはこの世界のフラットビューを持っているため、{0、4GB}記述子を使用してすべてのセグメントで実行されます。したがって、Windowsは、プロセスごとの記述子を割り当てる代わりに、少数のグローバル記述子のみを使用し、すべてのプロセスにそれらを使用させることができます。

編集2:

Portable Executable 形式はsectionsを定義します。これは、概念が重複している場合でも、x86 segmentsとは無関係です。 PE EXEは、ほぼすべてのセクションレイアウトを使用できますが、通常は、(少なくとも)コード(読み取り/実行)、データ(読み取り/書き込み)、リソース(読み取り専用?)に分割されます。実行可能ファイルをセクションに分割すると、x86ページレベルのメモリ保護をメモリ範囲に適用できます。

編集3:

通常のセグメントはプロセスごとに変更されませんが、WindowsはFSレジスタを使用して、スレッドごとを指します[〜#〜] tib [〜#〜] 構造。

編集4:

概要については、 this を参照してください。これは80386の古いドキュメントからのものですが、情報は引き続き適用されます。

30
snemarch

メモリアドレスは、セグメントとオフセットで構成されます。 DSは「データセグメント」レジスタです。