2016-12-11 30 views
-5

8086のセグメントの最小サイズと最大サイズはどれくらいですか?そして、最小限のために、私たちが持つことができる個別のセグメントの最大数はいくらですか?すべてが一度にアクティブである必要はありません。 (重複は許容されます)8086のセグメントの最大サイズと最小サイズはどれくらいですか?

+4

この質問の全文を単純にコピーして貼り付けて、[見つけたものを見る](http://www.eazynotes.com/notes/microprocessor/slides/memory-segmentation-of-8086.pdf) Google *へ。それはあなたの質問への正確な答えを含んでいます。 –

+0

良い質問です、私の返事を見てください。私はなぜ人々が質問を落としたのか分かりません。 –

答えて

0

最大サイズは64Kです。最小値はありません。最初のバイトのみを使用できますが、セグメントは常に64Kです。たぶん例外は最後のセグメントです - 最新(0xFFFF)は16バイトで、最新のものは32,48,64バイトです。一般に、8086セグメントは16ビットアドレスレジスタで64Kを超えるアドレス指定を行う方法です。

+4

0x8000以上のセグメントは、8086で0に折り返されます(80286+では0x1000000より上のバイトにアクセスします。互換性のために、PCはA20を無効にして8086互換ラップアラウンドを得ることができます)。 – rcgldr

1

8086マイクロプロセッサでは、合計メモリアドレッシング能力は1MBです。 1MBを表すためには、最小4桁の16進数、すなわち20ビットが必要である。 8086マイクロプロセッサは14個の16ビットレジスタを有する(すなわち、20ビットアドレスを表すためのレジスタはない)。したがって、合計メモリは16個の別個の論理セグメントに分割され、各セグメント容量は64KB(すなわち、16 * 64 KB = 1MB)である。

+0

"... 16個の論理セグメントに分割されました"メモリは、重複する65536個のセグメントに分割されています。 –

1

8086セグメントレジスタは16ビットなので、65536個のセグメントがありますが、重複しています。 20ビットの物理アドレスは、セグメントレジスタを左に4ビットシフトし、アドレスオフセットを加算することによって得られる。つまり、セグメントは任意の16バイトのアライメントで開始することができます。オーバーラップすると、1つのメモリ位置を追加する方法はたくさんあります。例えば、0000:00100001:0000は同じ場所を扱います。

アドレスオフセットも16ビットなので、任意のセグメントのアドレス指定可能なサイズは65536バイトです。したがって、セグメントの最大サイズは65536バイトで、最小サイズは16バイトですが、8086ではセグメント全体が保護されずに読み書きされる可能性があります。

あなたの最後の質問「個別のセグメントの最大数」は、16 個別のセグメントです。それ以上のものは重複します。

+0

"...最小は16バイトです"これはハードウェアに関しては意味がありません。これは、プログラムのセクション(セグメントとも呼ばれます)を扱うときに当てはまります。 –

+0

@SepRoland、ちょうどその質問に答えようとしています。可能な限り小さいセグメントは16バイトです。これはセグメントレジスタの分解能です。もしデザイナーが重複していない16個のセグメント(別の答えに暗示されているように)を意図していたら、セグメントレジスタには16個ではなく4個のビットしか与えられませんでした。 –

+0

@niloofarlatifianあなたは今質問を変更しました。私たちの足元の砂。最大セグメント数は65536です.8086では「アクティブセグメント」はありません。セグメントレジスタは、1MBのメモリをアドレス指定する方法を提供します。 –

0

リアルモードでは、セグメントには「サイズ」がありません。メモリはreal modeのセグメントで区切られません。セグメントは、より大きなエンティティの一部です:segment+offset - 両方とも実効アドレスの計算に使用されます。これらは、CPUがメモリバイトのアドレスを計算することを可能にするセグメントとオフセットの両方であり、バイトはIntelプラットフォーム上でアドレス可能な最小単位です。 「セグメント+オフセット」については、プログラマは“far pointer”を含むとも言います。反対に、“near pointer”は、両方とも同じセグメントを有する、他のポインタと比較する相対ポインタである。したがって、遠いポインタは、16ビットのセグメントセレクタと16ビット(またはモードに応じて32ビット)のオフセットからなるポインタであるため、遠いポインタの合計サイズは16ビットで32ビットでした32ビットモードでは48ビットです。セグメントセレクタは、遠いポインタからメモリにアクセスする前に、特別なセグメントレジスタにロードされる。一度に遠方のポインタをロードする特別な指示があります。 Intel 8086で最も一般的な命令は、メモリから一対のレジスタ、すなわち1つのセグメントレジスタ(DSまたはES)と1つの一般(オフセット)レジスタに遠いポインタをロードするLDSおよびLESでした。 LFSLGSLSSFSため、GSそれぞれ(Intel 80386で導入)SSセグメント・レジスタ:他のレジスタのバージョンもあります。セグメントは、16ビットリアルモードまたは16ビットプロテクトモードの場合、16ビットモードで非常に便利です。 16ビットのリアルモードでは、セグメントレジスタの値に16を掛けた後、オフセットが加算されました。これが実効アドレスの計算方法です。しかし、再び、リアルモードのメモリは「セグメント化されていない」ため、セグメントの最小サイズまたは最大サイズはありませんでした。16ビットリアルモードでは、DSレジスタとSIレジスタの両方にFFFFをロードすると、理論的には(16 * 0xFFFF)+ FFFF = メモリの第1バイトにアクセスできます(実際の制限はA20-lineなどのように適用されます) - または約1メガバイト

32-bit modeの下では、すべてのセグメントレジスタが本質的に同じ場所を指しているためセグメントレジスタにはほとんど必要がないため、セグメントレジスタをロードする必要はありません。

64-bit modesの下では、これらの命令は実装されておらず、オペコードによってアクセス違反が発生しました。インテルがVEX - "ベクトル拡張 - (SSE2)を実装して以来、インテルはLDSLESのオペコードを使用して、VEXプレフィックスで使用し始めた。 protected modeにおいて

、セグメントサイズなどの概念があり、しかし、再び、そこには最小サイズがなく、または最小サイズはアーキテクチャの最小割り当て単位、例えば16バイト16-bit mode又はました4キロバイト32-bit mode保護モードでは、セグメントレジスタは、16ビットのリセットのように16を乗算した値を保持しませんアルモードではなく、セレクタテーブル内のインデックス。インテル80286's protected modeの導入以来、プロセッサのアドレス空間を約1メガバイトから224バイト(16メガバイト)まで拡張しますが、より大きなオフセットを使用することはできません。代わりに、16ビットのセグメントレジスタは、オフセットが追加される24ビットのベースアドレスを含むセグメント記述子のテーブルへのインデックスを含むようになりました。最大セグメントサイズは64キロバイトでした。 Intel 80386以降のプロセッサでは、保護モードは80286保護モードのセグメンテーションメカニズムを保持しますが、セグメンテーションユニットと物理バスの間の第2アドレス変換レイヤとしてページングユニットが追加されています。また、アドレスオフセットは(16ビットではなく)32ビットであり、各セグメント記述子のセグメントベースも(24ビットの代わりに)32ビットです。その結果、最大セグメントサイズが理論上の最大値4GBに増加しました。興味深いことに、この考え方とは異なり、32ビットオペレーティングシステムでは4GBという物理的な制限はありません。たとえば、Microsoft Windows Server 2008 32ビットなどの32ビットサーバーオペレーティングシステムでは、最初に導入された物理アドレス拡張(PAE)によって、64 GB(Windows Server 2008 EnterpriseおよびDatacenterエディション)にアクセスできます。 Pentium ProのIntel、AthlonプロセッサのAMDの3つのレベルのページテーブル階層を定義しています。32ビットではなく64ビットのテーブルエントリがあり、これらのCPUは4ギガバイトを超える物理アドレス空間に直接アクセスできます理論的には、32ビットOSは理論的に2^64バイト、つまり17,179,869,184ギガバイトにアクセスできますが、セグメントは 4 GBで制限されています。

関連する問題