Renesas Synergy™

FAQ 107011 : C言語でセクションの先頭アドレスを取得する方法はありますか?

Q: 質問

C言語でセクションの先頭アドレスを取得する方法はありますか?

 


A: 回答

C言語でセクションの先頭アドレスや終了アドレスを取得する方法はありません。
アセンブリ言語で、topof, sizeof演算子を利用して取得してください。
以下にプログラムコードセクションXYZの開始アドレス、終了アドレスを取得する例を示します。
XYZセクションの開始アドレス、終了アドレスをアセンブラファイルで変数sec_top, sec_endに定義して、C言語ファイルから参照します。

アセンブラファイル記述例

  .glb _sec_top,  _sec_end
.section XYZ, code, align
.section rom_FE, romdata
_sec_top:
.lword topof XYZ
_sec_end:
.lword topof XYZ + sizeof XYZ
.end

ただし、R8Cファミリで-R8Cオプション指定時は次のようになります。

  .glb _sec_top,  _sec_end
.section XYZ, code, align
.section rom_NE, romdata
_sec_top:
.word topof XYZ
_sec_end:
.word topof XYZ + sizeof XYZ
.end

C言語ファイルからの参照例
下はXYZセクションの内容を0x600番地にコピーする例です。

extern char far *const sec_top;  ・・・(注)
extern char far *const sec_end; ・・・(注)

void XYZ_copy(void)
{
char *p;
char far *q;

for(p=(char*)0x600, q=sec_top; q<sec_end; p++, q++){
*p = *q;
}
}

(注)R8Cファミリで -R8Cオプション指定時はfar宣言は不要です。

 

適用製品

M32Cシリーズ用Cコンパイラパッケージ [M3T-NC308WA]
M16Cシリーズ,R8Cファミリ用C/C++コンパイラパッケージ [M3T-NC30WA]
R32Cシリーズ用Cコンパイラパッケージ
他にご質問がございましたら、リクエストを送信してください