%20%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%3F%20.png)
なぜ、セグメント レジスタ用の 16 ビットと 4 つの「ゼロ」ビットを含む 20 ビットの空き領域があるメモリ内のアドレスを見つける必要があるのでしょうか。
たとえば、CS レジスタが 346AH の場合、メイン メモリ内のコード セグメントは 346A0H、つまり 20 ビットになります。なぜそうするのでしょうか?
メモリ セグメントは 64K バイト (?) ですが、その 20 ビット以外の残りのスペースはどうなるのでしょうか?
申し訳ありませんが、私はコンピューターアーキテクチャにはあまり詳しくありません。
答え1
たとえば、CS レジスタが 346AH の場合、メイン メモリ内のコード セグメントは 346A0H、つまり 20 ビットになります。なぜそうするのでしょうか?
どうやらあなたが言及しているのはx86 セグメンテーション、もともと Intel 8086/88 CPU で使用されていたものです。この種の「セグメント」は普遍的ではありません。メモリには他の定義もあります。セグメント「」。
歴史的に見ると、シリコンと(フェライト)メモリはかつて非常に高価だったことを認識する必要があります。高価なメインフレームコンピュータに対抗するために、ミニコンピュータ1970 年代に登場したのが、低価格のコンピュータです。低コストを重視したため、通常は 16 ビットのアドレス バス (DEC PDP、Data General Nova、HP 21xx など) と最大 64 KB のメモリが採用されました。しかし、システム要件が大きくなるにつれて、より多くのメモリが必要になることが多くなりました。
既存の 16 ビット アドレスを使用しながら、より多くのメモリにアクセスできるメモリ スキームが考案されました。16
ビット アドレスで 64 KB のメモリ容量を拡張する最も一般的な手法は、メモリ バンクを使用することです。つまり、有効なメモリ アドレスの実際の上位ビットは、バンク レジスタによって指定されます。メモリ バンクを使用する主な利点は、メモリ サブシステム (CPU の外部) に実装できるため、どの CPU にも後付けできることです。
マイクロプロセッサの出現により、16 ビット アドレスを使用するシステム (Intel 8051、Zilog Z80 など) は、バンク メモリを組み込むなど、同様の方法で進化する傾向がありました。
Intel x86 (および私が知っている少なくとも 1 つの他のシステム) で使用されるセグメント アドレス指定はプロセッサに統合されている
ため、より汎用性があります。メモリ バンクは元のメモリ空間内の固定領域しか占有できませんが、x86 セグメントは、セグメント レジスタの指定と組み合わせた 16 ビットのオフセットを使用して、拡張された 20 ビットのアドレス空間へのアクセスを提供します。
x86セグメントアドレスは、実際には20ビットアドレスが16ビットに切り捨てられたものです。
そのセグメントはどの段落からでも開始できます(16を法とするアドレスはゼロです)。
したがって、20ビットのメモリ空間でx86セグメントの実際の開始を取得するには、切り捨てられた4つのゼロビットを追加する必要が
あります。x86 メモリ モデルx86 ソフトウェアは、主に 16 ビットの「アドレス」を使用できましたが (古いソフトウェアと同様)、古い 16 ビット アドレス ソフトウェアよりも効率的なメモリにアクセスできました。
つまり、x86 セグメントは、ハードウェアを 20 ビット アドレス バスに拡張する方法ですが、ソフトウェアは主に 16 ビットの「アドレス」を使用でき、20 ビットの演算 (つまり、20 ビット幅のレジスタとデータ) を必要としません。