2

私の知る限り、16 ビット PC の時代には、セグメント レジスタに各タイプのセグメントのアドレスが含まれていて、この SS:[EDI] のようなものでオフセットにアクセスできました。これは EDI に含まれる値をスタック セグメントへのオフセット。

これで、32 ビット システムには GDT (グローバル記述子テーブル) と LDT (ローカル記述子テーブル) があり、セグメントにはそのテーブルへのインデックスが含まれ、正しいメモリ アドレスを指すオフセットを計算できることがわかりました。

私の理解は正しいですか?

PUSH DWORD PTR SS:[EBP+8] ; basicbof.00401000

では、このようなステートメントは 32 ビット OS (XP SP2) では何を意味するのでしょうか?

4

3 に答える 3

3

セグメント レジスタにセレクタが含まれるようになりました。各セレクターは、グローバルまたはローカル記述子テーブルのインデックスと、要求されたセキュリティ レベルです。

例えば:

mov ds, 0x0000

DS へのレベル 0 アクセスで、テーブル 0 (GDT) からセレクター 0 を配置します。(これは、NULL ポインターのテストに使用される特殊なレジスターです)。

テーブルには、各セレクターのベース + 長さの情報が含まれているため、64K に制限されなくなりました (ただし、0 から 4GB までの範囲である可能性があります)。

これらについて学ぶ最善の方法は、(無料で入手できる) Intel プロセッサのドキュメントを読むことです。

編集:リンク

于 2010-07-26T18:54:48.463 に答える
0

SS DS ES などのセレクターは、同じ (通常は 4k バイト) ページを指しているため、ユーザーランドでは無意味であることに注意してください。カーネルプログラミングについてはどうなのかわかりません...

于 2010-07-26T21:25:32.557 に答える
0

phu - 10 年後、私の知識は少し錆びています。

sukru answer は、私が覚えていることです。

アセンブリ ステートメントを次のように解釈します: StackSegment:BasePointer+8 (= ローカル変数またはメソッド パラメーター - 覚えていない) で DWORD を取得し、スタックに配置します。

于 2010-07-26T18:59:35.317 に答える