2016-08-09 6 views
1

私はコンピュータのアーキテクチャをインテルマニュアルから勉強しています。私が理解することは、私たちが与える命令はセグメントセレクタとオフセットからなる論理アドレスであるということです。 基本的にはCS register<<4 + offsetです。 Segment Selectorは、セグメントセレクタのTIビットに指定されているようにGDTまたはLDTにマップします。 GDTは、BASE,LIMITおよびRPLを有し、出力はベースアドレスであるSegment Descriptorsからなる。このbase address + offsetlogical addressです。どのセグメントレジスタがデフォルトで使用されていますか?

どのセグメントレジスタ(SSDSなど)が異なるメモリ操作に適用されるかを決定するルールは何ですか?例えばどのセグメントがmov eax, [edi]に使用されるかを決定する

+0

あなたの質問は明確ではありません。私は少し説明できますか? – Rupsingh

+0

基本的には、そのデータセグメント、スタックセグメントがどのようにプロシージャに割り当てられるのかを知りたがっています。 – ashish

+0

これは役立ちますhttp://stackoverflow.com/questions/29785991/can-someone-help-me-with-segmentation-and-8086-intels-マイクロプロセッサ – Rupsingh

答えて

2

命令のプレフィックスを使用して、命令内のメモリオペランドに適用するセグメントを選択できます。

コードフェッチでは常にCSが使用されます。

ほとんどの場合、デフォルトはDS(たとえば、mov eax, [edi])です。逆アセンブラの中には、デフォルトのときでもセグメントを明示的にするものがありますので、多くのDS:が逆アセンブリ出力を乱雑にしています。

[DS:ESI]から読み取り、[ES:EDI]に書き込み、セグメントオーバーライドプレフィックスのないセグメント間のコピーを容易にします。他の文字列命令の中には、ESも使用しています。

メモリオペランドがSSにベースレジスタのデフォルトとしてespまたはebpを使用して、そのためpush/pop/call/retのようなスタック命令の暗黙的なアクセスを行います。

FSGSは決してデフォルトではないため、32ビットと64ビットの最新のOSなどのフラットなメモリモデルシステムで特殊な用途(スレッドローカルストレージなど)に使用できます。

wikipedia explains the same thing here


これもIntel's ISA manualsに正式に文書化されています。例えば第2巻(命令セット参照)、表2-1。

デフォルトのセグメント・レジスタは、他の有効なアドレスについてBPインデックス、DSを含有する有効アドレスのSSである:のModR/Mバイトでフォームを16ビットアドレッシングは言っ脚注を有しています。

(SPは16ビットアドレッシングモードの有効なベースアドレスではないことに注意してください。)

あり32または64ビット・アドレッシング・モードのための同等の脚注はいないので、詳細は別のボリュームになければなりませんマニュアルの

さらに詳しいリンクについては、のタグwikiを参照してください。

+0

これらのセグメントはどこにありますか?線形アドレス?物理アドレス? – ashish

+1

@ashish:現在の32ビットOSでは、すべてのセグメント(FSおよびGSを除く)はベース= 0、リミット= 4GiBを持ち、 'CS'、' DS'、 'SS'および' ES' 'はすべて同等です。セグメント変換は、仮想アドレスから物理アドレスへの変換の前に行われます。リアルモードでは、セグメントレジスタはディスクリプタをインデックス化せず、16倍しただけでアドレスのオフセット部分に追加されます。 –

+0

ロングモード、つまりx86_64モードでは? – ashish

関連する問題