メモリ モデル

Light C では、次の 4 つのメモリ モデルを使用できます。

名前オプションデータの制限コードの制限
small -as (既定値) 64 KB まで (near) 64 KB まで (near)
medium -am 64 KB まで (near) 無制限 (far)
compact -ac 無制限 (far) 64 KB まで (near)
large -al 無制限 (far) 無制限 (far)

これらのメモリ モデルに対応して、4 種類のライブラリ関数が用意されています。

データへの標準的なポインタは、small および medium モデルでは near、compact および large モデルでは far になります。コードへの標準的なポインタは、small および compact モデルでは near、medium および large モデルでは far になります。ポインタの種類を明示的に指定するには、キーワード near (_near) および far (_far) を使用します。

near データと far データ

ライブラリ関数は、(特に明記されている場合を除き) 標準サイズのポインタを受け取ります。キーワード far を使って定義したデータは、標準ライブラリ関数には渡せない場合があるので注意してください。次に例を示します。
static char far buf[1000];
strcpy( buf, "string" );

このコードを small または medium モデルでコンパイルすると、警告が発生し、正しいコードは生成されません。buf は 4 バイトの far アドレスを表しますが、small および medium モデルの strcpy 関数は 2 バイトの near アドレスしか受け取れません。

この場合は、far データ用の _fstrcpy 関数を使用します。よく使用される関数には、このように far データ用のバージョンが用意されています。
static char far buf[1000];
_fstrcpy( buf, "string" );

near アドレスの "string" は、_fstrcpy に渡すために自動的に far アドレスに変換されます。

near を使って定義したデータを compact または large モデルの標準ライブラリ関数に渡す場合は、問題は生じません。この場合は、near アドレスが自動的に far アドレスに変換されます。

near コードと far コード

far メモリに置かれた関数から、near メモリに置かれた関数を呼び出すことはできません。far 関数から near 関数を呼び出すと、共通のフレームを持たないラベルへの相対ジャンプが行われたことを示すアセンブラの警告が表示されます。

これに対して、near メモリに置かれた関数から far メモリに置かれた関数を呼び出すことは可能です。
void near func1();
void far func2();
void near func10() {
  func1(); // 可能
  func2(); // 可能
}
void far func20() {
  func1(); // 不可能
  func2(); // 可能
}