セグメント名

C 言語の中では、セグメントの名前を意識する必要はありません。しかし、アセンブラなどで記述した別のルーチンとリンクしたり、ROM 化ソフトウェアでセグメントごとにロード アドレスを指定する場合には、セグメント名が関係します。

生成されたコードは、次のセグメントに置かれます。

セグメント名コンバインクラス備考
cseg public CODE near コード
kseg public CONST near 定数データ
dseg public DATA near データ
bseg public BSS 初期化されないファイル内 near データ
c_common public BSS 初期化されない共有 near データ
sseg stack STACK スタック領域
cseg_fname private FAR_CODE far コード
kseg_fname private FAR_CONST far 定数データ
dseg_fname private FAR_DATA far データ
bseg_fname private FAR_BSS 初期化されないファイル内 far データ
FAR_BSS private FAR_BSS 初期化されない共有 far データ

上の表で、fname はソース ファイル名です。

例 (small モデルの場合)

int func() { } // → cseg
const char csd[] = "123"; // → kseg
char data[] = "123"; // → dseg
static int bss; // → bseg
int common; // → c_common
int far ffunc() { } // → cseg_fname
const char far fcsd[] = "123"; // → kseg_fname
char far fdata[] = "123"; // → dseg_fname
static int far fbss; // → bseg_fname
int far fcommon; // → FAR_BSS

near データ用のセグメント (ksegdsegbsegc_commonsseg) は、いずれもグループ DGROUP に属します。コードの実行中、DGROUP の位置は ds レジスタによって示されます。

セグメント名の変更

オプション -segn および -segc を使用すると、上のセグメント名とセグメント クラス名を変更できます。#pragma segment を使用して、ファイル内の一部のコードについてのみ、セグメント名およびセグメント クラス名を変更することもできます。

セグメント名を変更したプログラムをライブラリ関数とリンクする場合は、作成したプログラムが使用するセグメント名と、ライブラリ関数で使用されているセグメント名との整合性に注意してください。たとえば、small モデルでコード セグメントの名前を「cseg」以外に変更すると、そのセグメントからライブラリ関数を呼び出すことはできなくなります。

ライブラリのソース コードを変更して、他のセグメント名を使用することもできます。その場合は、common.inc ファイルを編集する必要があります。