真の 16 ビット環境では、任意のアドレスに到達する 16 ビット ポインターが使用されます。例には、PDP-11、6800 ファミリ (6802、6809、68HC11)、および 8085 が含まれます。これは、単純な 32 ビット アーキテクチャと同様に、クリーンで効率的な環境です。
80x86 ファミリは、いわゆる「リアル モード」でのハイブリッド 16 ビット/20 ビット アドレス空間、つまりネイティブ 8086 アドレス空間を強制しました。これに対処するための通常のメカニズムは、ポインターの型をnear
(16 ビット ポインター) とfar
(32 ビット ポインター) の 2 つの基本型に拡張することでした。コードおよびデータ ポインタのデフォルトは、「メモリ モデル」によってまとめて設定できます: tiny
、small
、compact
、medium
、far
およびhuge
(一部のコンパイラはすべてのモデルをサポートしていません)。
tiny
メモリ モデルは、スペース全体 (コード + データ + スタック) が 64K 未満の小さなプログラムに役立ちます。すべてのポインターは (デフォルトで) 16 ビットまたはnear
; ポインターは、プログラム全体のセグメント値に暗黙的に関連付けられます。
このsmall
モデルは、データ + スタックが 64K 未満で、同じセグメントにあることを前提としています。コード セグメントにはコードのみが含まれるため、最大メモリ フットプリントが 128K の場合、最大 64K も含めることができます。コード ポインタはnear
、暗黙的に CS (コード セグメント) に関連付けられています。データ ポインタもnear
DS (データ セグメント) に関連付けられています。
モデルには最大 64Kのmedium
データ + スタック (小規模のようなもの) がありますが、任意の量のコードを含めることができます。データ ポインタは 16 ビットで、暗黙的にデータ セグメントに関連付けられています。コード ポインターは 32 ビットfar
ポインターであり、リンカがコード グループをどのようにセットアップしたかによってセグメント値を持ちます (厄介な簿記の手間)。
モデルはメディアの補完です。compact
コードは 64K 未満ですが、データの量は問いません。データ ポインタはfar
で、コード ポインタはnear
です。
large
またはモデルではhuge
、ポインタのデフォルトのサブタイプは 32 ビットまたはfar
. 主な違いは、巨大なポインターは常に自動的に正規化されるため、それらをインクリメントすると 64K のラップ アラウンドの問題が回避されることです。これを参照してください。