Everything

saddr領域利用(__saddr)


__saddr 宣言された外部変数,および関数内static変数をsaddr領域に割り当てます。

[機能]

-

初期値あり変数はセクション.sdataに配置します。

-

初期値なし変数はセクション.sbssに配置します。

-

アドレス参照は,必ずnearポインタを返します。

-

__saddr宣言された外部変数,および関数内static変数は,saddr領域に割り当てます。

-

C ソース中において,通常の変数と同様に扱います。

[効果]

-

saddr領域に対する命令は,通常メモリに対する命令よりも短く,オブジェクト・コードが小さくなり,実行速度が向上します。

[方法]

-

変数を定義するモジュール中,および関数の中で, __saddr 宣言を行ないます。
関数の中では,extern,またはstatic記憶域クラス指定子が付いている変数のみ宣言することができます。

__saddr 変数宣言;
extern __saddr  変数宣言;
static __saddr  変数宣言;
__saddr extern  変数宣言;
__saddr static  変数宣言;

[制限]

-

const型変数に__saddrを指定した場合は,コンパイル・エラーとなります。

-

関数に__saddrを指定した場合は,コンパイル・エラーとなります。

-

__saddr を静的記憶域期間を持つ変数以外に使用した場合は,コンパイル・エラーとなります。

-

__saddrと__near/__farを同時指定した場合は,コンパイル・エラーとなります。

__saddr __near int      ni;     //エラー
__saddr __far int       fi;     //エラー

-

typedef中に__saddrを使用した場合は,コンパイル・エラーとなります。

typedef __saddr int     SI;     //エラー

[使用例]

Cソースを以下に示します。

__saddr int     hsmm0;          //.sbss
__saddr int     hsmm1=1;        //.sdata
__saddr int     *hsptr;         //hsptrは.sbssに配置する。指す先は通常の領域。
void main(){
        hsmm0 -= hsmm1;
        hsptr = 0;
}

 

アセンブリ・ソースにおける宣言とセクション割り付けは以下となります。

        .PUBLIC _hsmm0                  ;宣言
        .PUBLIC _hsmm1                  ;宣言
        .PUBLIC _hsptr                  ;宣言
 
        .SECTION        .sbss,SBSS      ;.sbssセクションへの割り付け
        .ALIGN  2
_hsmm0:
        .DS     2
        .ALIGN  2
_hsptr:
        .DS     2
 
        .SECTION        .sdata,SDATA    ;.sdataセクションへの割り付け
        .ALIGN  2
_hsmm1:
        .DB2    0x0001

 

関数中のコードは以下となります。

        movw    ax, _hsmm0
        subw    ax, _hsmm1
        movw    _hsmm0, ax
        movw    _hsptr, #0x0000

[備考]

-

キーワード__saddrと#pragma saddrの違いについて

-

__saddrキーワードは,__near/__farキーワードとの混在を許さずコンパイル・エラーとなります。

-

#pragma saddrは,__near/__farキーワードを付加した変数でも警告なしで__saddrを指定したものとして扱います。