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

どういうDS:意味ですか?

4

2 に答える 2

35

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

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

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

編集:

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

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

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

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

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

編集2:

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

編集3:

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

編集4:

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

于 2010-09-29T07:56:08.520 に答える
4

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

于 2010-09-29T07:54:54.617 に答える