Light C | ← → 目次 索引 |
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 はソース ファイル名です。
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 データ用のセグメント (kseg、dseg、bseg、c_common、sseg) は、いずれもグループ DGROUP に属します。コードの実行中、DGROUP の位置は ds レジスタによって示されます。
オプション -segn および -segc を使用すると、上のセグメント名とセグメント クラス名を変更できます。#pragma segment を使用して、ファイル内の一部のコードについてのみ、セグメント名およびセグメント クラス名を変更することもできます。
セグメント名を変更したプログラムをライブラリ関数とリンクする場合は、作成したプログラムが使用するセグメント名と、ライブラリ関数で使用されているセグメント名との整合性に注意してください。たとえば、small モデルでコード セグメントの名前を「cseg」以外に変更すると、そのセグメントからライブラリ関数を呼び出すことはできなくなります。
ライブラリのソース コードを変更して、他のセグメント名を使用することもできます。その場合は、common.inc ファイルを編集する必要があります。
セグメント名の変更
Copyright © Tama Software Ltd, 1999-2012. | ← → 目次 索引 |