32 ビット コンパイラにニア、ファー、ヒュージ ポインタの概念がないのはなぜですか? 私が理解している限り、16 ビット 8086 アーキテクチャ コンパイラで作成されたプログラムは、データ セグメント、グラフィック セグメントなどがある 1 mb のサイズを持つことができます。これらすべてのセグメントにアクセスし、ポインターのインクリメントの概念を維持するには、これらのさまざまなポインターが必要ですが、なぜ 32 ビットでは必要ないのでしょうか?
2 に答える
32 ビット コンパイラは、単一の 32 ビット ポインターを使用して、プログラム (または OS) が使用できるアドレス空間全体をアドレス指定できます。ポインターは、使用可能なアドレス空間内の任意のバイトをアドレス指定するのに十分な大きさであるため、ベース化の必要はありません。
理論的には、4 GB を超えるメモリに対応する 32 ビット OS を考えることができます (したがって、16 ビット OS と共通のセグメント システムが必要になります)。 .
なぜ 32 ビット コンパイラにニア、ファー、ヒュージ ポインタの概念がないのですか?
プラットフォームとコンパイラに依存します。Open Watcom C/C++ は、16 ビット コードでニア、ファー、ヒュージ ポインターをサポートし、32 ビット コードでニア ポインターとファー ポインターをサポートします。
私が知っているように、16ビット8086アーキテクチャコンパイラで作成されたプログラムは、データセグメントグラフィックセグメントなどが存在する1 mbのサイズを持つことができます。これらすべてのセグメントにアクセスし、ポインターのインクリメントの概念を維持するには、これらのさまざまなポインターが必要ですが、なぜ 32 ビットでは必要ないのでしょうか?
ほとんどの場合、32ビットに近いポインターはアドレス空間全体をカバーするのに十分であるため(2 32バイトすべて= 4GB)、これは、あなたが言ったようにカバーできるのは16ビットに近いまたは遠い16ビットポインターには当てはまりません最大 1 MB のメモリ (厳密に言えば、80286+ の 16 ビット プロテクト モードでは、16 ビットの far ポインタを使用して少なくとも 16 MB のメモリをアドレス指定できます。これは、これらのポインタがセグメントの先頭に相対的であるためです)また、80286+ のセグメントは、最初の 16 MB のどこからでも開始できます。これは、グローバル記述子テーブル ( GDT
) またはローカル記述子テーブル ( LDT
) のセグメント記述子がセグメントの開始アドレス用に 24 ビットを予約しているためです (2 24バイト = 16 MB)) 。 .