構文 .CODE [<名前>] .DATA .CONST .DATA? .STACK [<サイズ>] .FARDATA [<名前>] .FARDATA? [<名前>] 例 .MODEL LARGE DOSSEG .CODE MAIN MAIN PROC ... MAIN ENDP .DATA DW 1,2,3 ; Near Data .DATA? DB 256 DUP(?) ; Ininitialized Data .CONST DB 'Constant Data' .FARDATA DW 4,5,6 ; Far Data .STACK 512 END
これらの文はセグメントを定義します。すなわち SEGMENT 文に相当する機能を持っています。これらの文によって開始されたセグメントには ENDS 文は必要ありません。別のセグメントが開始されるか END 文が宣言されれば、これらのセグメントは自動的に終了します。
.CODE 文はコードを置くためのセグメントを定義します。メモリモデルが MEDIUM または LARGE の場合は、<名前>を指定すればこのセグメントの名前を自由に決めることができます。
.DATA 文は NEAR タイプのデータを置くセグメントを定義します。
.CONST 文は NEAR タイプのデータのうち、変更をうけないデータを置くセグメントを定義します。
.DATA?文は NEAR タイプのデータのうち、初期化されないデータを置くセグメントを定義します。
.STACK 文はスタック用のセグメントを定義します。<サイズ>にはスタックサイズを 1 バイト単位で指定できますが、省略した場合は 1024 バイトになります。
.FARDATA 文は FAR タイプのデータを置くセグメントを定義します。<名前>を指定すればこのセグメントの名前を自由に決めることができます。この文は COMPACT、LARGE の各メモリモデルでのみ使用できます。
.FARDATA?文は FAR タイプのデータのうち、初期化されないデータを置くセグメントを定義します。<名前>を指定すればこのセグメントの名前を自由に決めることができます。この文は COMPACT、LARGE の各メモリモデルでのみ使用できます。
以上が各文の役割です。この役割を守らなくてもアセンブルエラーになるわけではありませんが、各文の定義するセグメントは、その役割に適するように名前、属性やクラスを決められているので、各セグメントの役割に従ってコードやデータを配置してください。
各文の定義するセグメントの名前、属性やクラスは、基本的に次のようになります。
ディレクティブ | セグメント名 | アライン | コンバイン | クラス | 所属グループ |
.CODE | _TEXT | WORD | PUBLIC | 'CODE' | |
.FARDATA | FAR_DATA | PARA | PRIVATE | 'FAR_DATA' | |
.FARDATA? | FAR_BSS | PARA | PRIVATE | 'FAR_BSS' | |
.DATA | _DATA | WORD | PUBLIC | 'DATA' | DGROUP |
.CONST | CONST | WORD | PUBLIC | 'CONST' | DGROUP |
.DATA? | _BSS | WORD | PUBLIC | 'BSS' | DGROUP |
.STACK | STACK | PARA | STACK | 'STACK' | DGROUP |
上記に表はメモリモデルによって若干の違いがあります。
.CODE 文によるセグメントの名前は、SMALL/COMPACT モデルでは「_TEXT」ですが、MEDIUM/LARGE モデルでは「<ファイル名>_TEXT」の形になります。ここで<ファイル名>は、ソースファイル名から拡張子を除外したものです。
.FARDETA 文と .FARDETA?文によるセグメントは、SMALL/MEDIUM モデルには存在しません。
メモリモデルが MEDIUM または LARGE の場合は、.CODE 文、.FARDETA 文、.FARDETA?文ではセグメント名を明示的に指定することが可能です。
簡略化セグメント定義文によって定義された各セグメント名は、「セグメント等価記号」で参照することができます。たとえば .CODE 文で定義されたセグメントの名前は、「.」を「@」にかえた「@CODE」で表されます。そのほかのセグメントも同様に「@DATA」「@DATA?」などと表されます。これらの名前は、それぞれのセグメント名にマクロ(EQU)定義されています。