ロケータは、次のラベルを参照するとき、それぞれのラベルにアドレスを割り当てます。
__lc_cp: コピーテーブルの開始。コピーテーブルは、コピーするセクションのソースアドレスと
デスティネーションアドレスを指定します。このテーブルは、このラベルが使用される 場合に限り、ロケータによって生成されます。
__lc_bs: スタック空間の開始(キーワードstackを使用)。
__lc_es: スタック空間の終了。スタックポインタの初期化。
__lc_b_name: セクションnameの開始。
__lc_e_name: セクションnameの終了。
__lc_u_name: ユーザ定義ラベル。このラベルは記述ファイルで定義します。例を示します。
label mylab;
__lc_ub_name:ユーザ定義ラベルの開始。このラベルは記述ファイルで定義します。例を示します。
label mybuffer length=100;
__lc_ue_name:ユーザ定義ラベルの終了。
4.9.1 ロケータラベルのリファレンス
この節では、すべてのロケータラベルについて説明します。ロケータラベルは、__lc_が最初に付きます。
これらのラベルは、リンカでは無視されて、ロケート時に解決されます。これらのラベルには、セクショ ンの最初と最後に実際に置かれるラベルになるものもあります。他のラベルについては、ロケータ生成デー タをアドレスするときにも使用できるようになっています。これらのデータは、ラベルが使用されるとき に限り生成されます。
__lc_が最初に付くラベルは、リンカとロケータで扱い方が変わるため、この種のラベルは、定義用ではな く参照用として使用します。
注: Cのレベルでは、すべてのロケータラベルの最初にアンダースコア( ̲ )が1つ付いています(コンパイ ラがアンダースコアをもう1つ追加する)。
__lc_b_section, __lc_e_section
構文:
extern unsigned char _lc_b_section[ ];
extern unsigned char _lc_e_section[ ];
説明:
プログラム内のセクションsectionのアドレスを取得するときに、一般ロケータラベル__lc_b_sectionと __lc_e_sectionを使用することができます。bバージョンは、セクションの最初をポイントし、eバージョ ンは、セクションの最後をポイントします。
セクション名の前のドットをアンダースコア(̲)で置換することにより、これらのラベルに"C"からアク セスできるようになります。ただしこの変換により、名前の競合が発生する可能性があります。たとえ ば、セクション.textとセクション_textの両方が存在する場合、一般ラベル__lc_b_textは、
_textの最初に設定されます。そのためセクション.textのラベルは、アセンブリレベルでのみ実際の 名前によって使用することができます。このような競合は、もちろん回避する必要があるため、アン ダースコアが最初に付くセクション名は使用しないようにします。
例:
Printf ("Text size is 0x%x¥n", _lc_e__text-_lc_b__text);
__lc_bh, __lc_eh
構文:
extern unsigned char _lc_bh[ ];
extern unsigned char _lc_eh[ ];
説明:
すべてのロケータhラベルは、ヒープに関連しています。ヒープは、クラスタの記述で定義することに よって割り当てることができます。DELFEEキーワードheapも参照してください。
__lc_bhは、ヒープの最初に置かれるラベルです。"C"レベルの場合、_lc_bhはヒープを表します。この ラベルはchar配列として定義されますが、任意の基本型の配列として定義することができます。__lc_eh は、ヒープの最後を表します。
例:
ヒープの定義
block total_range { .
.
cluster ram { amode data {
heap length = 200;
. } } . }
sbrkコード
extern unsigned char _lc_bh[];
extern unsigned char _lc_eh[];
static char *
sbrk( long length ) { .
.
if ( (lastmem + length) > _lc_eh ) { return (char *) -1; /* overflow */
}
__lc_bs, __lc_es
構文:
extern unsigned char _lc_bs[ ];
extern unsigned char _lc_es[ ];
説明:
すべてのロケータsラベルは、スタックに関連しています。スタックは、クラスタの記述で定義するこ とによって割り当てることができます。DELFEEキーワードstackも参照してください。
__lc_bsは、スタックの最下位アドレスのラベルです。"C"レベルの場合、_lc_bsはスタックの下位アドレ スを表します。このラベルはchar配列として定義されますが、任意の基本型の配列として定義すること ができます。__lc_esは、スタックの最上位アドレスを表します。__lc_esは、__lc_bsより高いアドレスに なります。S1C88のスタックはもっと低いアドレスになるため、実際にはスタックはラベル__lc_esで開 始し、__lc_bsで終了します。
例:
スタックの定義
block total_range { cluster ram { amode data {
stack length = 100;
. } } }
スタックの初期化 __START:
LD SP, #__lc_es ; set stack pointer to begin of stack space
__lc_cp
構文:
extern char* _lc_cp;
説明:
コピーテーブルはプロセスごとに生成されます。このテーブルの各エントリは、コピーまたは消去のア クションを表しています。テーブルのエントリは、次のセクションで、ロケータによって自動的に生成 されます。
- 属性bを持つすべてのセクション。スタートアップ時にクリアされます(クリアアクション)。 - 属性iを持つすべてのセクション。プログラムのスタートアップ時にROMからRAMへコピーされま
す(コピーアクション)。
コピーテーブルのレイアウトは、"4.8 コピーテーブル"に記述されています。タイプcpt-tはlocate.h を定義しています。
__lc_u_identifier
構文:
extern int _lc_u_identifier[ ];
説明:
このロケータラベルは、ユーザがDELFEEキーワードlabelを使用して定義することができます。このラ ベルは、DELFEEファイルで、接頭辞__lc_u_を付けずに定義する必要があります。アセンブリからは接 頭辞__lc_u_を付けてラベルを参照することができ、Cからは接頭辞_lc_u_(最初のアンダースコアが1つ)
を付けて参照できます。
例:
記述ファイルの内容 block total_range {
cluster ram { amode data {
label bstart;
section text;
label bend;
} } . . }
Cからの呼び出し
#include <stdio.h>
extern int _lc_u_bstart[];
extern int _lc_u_bend[];
int main() {
printf( "Size of cluster ram is %d¥n", (long)_lc_u_bend
(long)_lc_u_bstart );
}
__lc_ub_identifier, __lc_ue_identifier
構文:
extern int _lc_ub_identifier[ ];
extern int _lc_ue_identifier[ ];
説明:
これらのロケータラベルは、ユーザがDELFEEキーワードreserved label=を使用して定義することができ ます。このロケータラベルは、予約領域の最初と最後を指定します。identifierは予約領域の名前であり、
DELFEEファイルで、接頭辞__lc_ub_または__lc_ue_を付けずに定義する必要があります。アセンブラか らは接頭辞__lc_ub_および__lc_ue_を付けてラベルを参照することができ、Cからは接頭辞_lc_ub_およ び_lc_ue_(最初のアンダースコアが1つ)を付けて参照できます。
例:
記述ファイルの内容 block address_range {
cluster ram {
attribute w;
amode data {
section selection=w;
reserved label=xvwbuffer length=0x10;
// Start address of reserved area is // label __lc_ub_xvwbuffer
// End address of reserved area is // label__lc_ue_xvwbuffer
} }
}
Cからの呼び出し
#include <stdio.h>
extern int _lc_ub_xvwbuffer[];
extern int _lc_ue_xvwbuffer[];
int main() {
printf( "Size of reserved area xvwbuffer is %d¥n", (long)_lc_ue_xvwbuffer
(long)_lc_ub_xvwbuffer );
}