| 
 絶対番地配置指定(#pragma address) 
 | 
絶対番地に配置する変数を定義したいモジュール中で#pragma address宣言を行うことにより,任意のアドレスに変数を配置することができます。
[機能]
[効果]
[方法]
-  | 絶対番地に配置する変数を定義したいモジュール中で,#pragma address宣言を行います。  | 
 
#pragma address [(]変数名=絶対アドレス[,...][)] 
 | 
 
注  | 絶対アドレス:実効アドレス(C言語表記の2,8,10または16進数定数で記述)  | 
 
[制限]
-  | #pragma address指定は,変数の宣言前にしてください。変数宣言後の#pragm aaddress指定は作用しません(警告も出力されません)。  | 
 
-  | const修飾した変数に対して#pragma addressを指定する場合はエラーとなります。【V1.04以前】  | 
 
#pragma address i=0xf2000 
const int       i = 0;          //エラー 
 | 
 
-  | 初期値付きで宣言した変数に対して#pragma addressを指定する場合はエラーとなります。【V1.04以前】  | 
 
-  | 初期値付きで宣言したconst修飾型でない変数に対して#pragma addressを指定する場合はエラーとなります。【V1.05以降】  | 
 
#pragma address i=0xf2000 
int     i = 0;                  //エラー 
 | 
 
-  | #pragma addressを同一の変数に対して複数回指定した場合はエラーとなります。  | 
 
#pragma address i=0xf2000 
#pragma address i=0xf2000       //エラー 
int     i; 
 | 
 
-  | 異なる変数に対して同一アドレスを指定した場合,もしくは変数のアドレスが重なった場合はエラーとなります。  | 
 
-  | 暗黙,明示問わずにnearと指定した変数に対して#pragma address宣言する場合,指定した絶対アドレスが0x0F0000 ~ 0x0FFFFFの範囲に無い場合はコンパイル・エラーとなります。指定した絶対アドレスがSFR領域である場合はリンク・エラーとなります。【V1.04以前】  | 
 
-  | 暗黙,明示問わずにnearと指定したconst修飾型でない変数に対して#pragma address宣言する場合,指定した絶対アドレスが0x0F0000 ~ 0x0FFFFFの範囲に無い場合はコンパイル・エラーとなります。指定した絶対アドレスがSFR領域である場合はリンク・エラーとなります。【V1.05以降】  | 
 
#pragma address n_i1=0xF0000 
char    __near n_i1;            //コンパイル可 
#pragma address n_i2=0xEFFFF 
char    __near n_i2;            //エラー 
#pragma address n_i3=0xEFFFF 
char    n_i3;                   //エラー 
                                //-memory_model=small,mediumともにbssはnearであるため 
#pragma address f_i=0xEFFFF 
char    __far f_i;              //コンパイル可 
 | 
 
-  | 暗黙,明示問わずに,nearと指定したconst変数に対して指定したアドレスがミラー元領域にない場合,リンク・エラーとなります。【V1.05以降】  | 
 
#pragma  address  i=0xf3000 
const    int  i = 0;           // エラー 
 | 
 
[使用例]
Cソースを以下に示します。
#pragma address (io=0x0ffe00) 
  
int     io;                     //ioは0x0ffe00番地に配置 
func(void){
        io = 0; 
} 
 | 
 
 
アセンブリ・ソースにおける変数の宣言とセクション割り付けは以下となります。
        .PUBLIC         _io 
  
        .SECTION        .bss, BSS 
        .ORG            0xFFE00 
_io: 
        .DS             2 
 | 
 
 
関数中では以下のコードが出力されます。
clrw    ax 
movw    !LOWW(_io), ax 
 | 
 
[備考]
-  | #pragma address指定しても,変数にvolatile属性を自動付加することはしません。 
オプション-volatileを使うことで,#pragma addressを含む全ての静的変数にvolatile属性を付加することができます。 
個別にvolatileを付加する場合は,変数宣言にvolatileを付けてください。  | 
 
-  | 変数を特定の番地に割り当てるにあたっては,変数の整列条件を配慮してください。また,64Kバイト境界をまたいで配置しないようにしてください。  |