構文 .STARTUP
プログラムの開始コード(スタートアップコード)を生成します。開始コードでは、DS、SS、SP の各レジスタの値を初期化します。このディレクティブは .MODEL 文と一緒でなければ使用できません。
生成されるコードは、プロセッサが 80286 以上かどうかと、スタックが FARSTACK に指定されているかどうかによって変わります。
「.286」以上のディレクティブが指定されておらず、.MODEL 文の FARSTACK 属性も指定されていない場合は、次のコードが生成されます。
@Startup: mov dx,DGROUP mov ds,dx mov bx,ss sub bx,dx shl bx,1 shl bx,1 shl bx,1 shl bx,1 cli mov ss,dx add sp,bx sti
ラベル「@Startup」が自動的にプログラムの開始位置になります。このため、END 文に開始アドレスを指定する必要はありません。
このコードでは、DS および SS レジスタに DGROUP のセグメント値をセットし、SP レジスタに DGROUP 相対のスタック末尾位置をセットしています。SS と SP には、プログラム開始時に MS-DOS によってスタックセグメント(STACK コンバイン属性を持つセグメント)の値とその末尾のオフセットがそれぞれセットされています。しかし、この .STARTUP 文の開始コードでは、SS を DS と同じ値にセットし直し、SP をそれに合わせて調整します。DS と SS が同一の値を持つことの利点は、スタック上のアドレスとデータセグメント上のアドレスを DS と SS のいずれからでも同じオフセットで参照できることです。このため、Microsoft C や Turbo C などでは通常この方式を採用しています。この方式の欠点は、DS と SS からアクセスできるデータが合計で 64KB に制限されることです。
プロセッサが 80286 以上の場合
.286 文またはそれと同等以上の文がある場合は、80286 以上に専用の命令を使用して開始コードにが生成されるので、多少効率的になります。つまり、4つの「shl bx,1」の代わりに1つの「shl bx,4」が生成されます。また、「cli」および「sti」は不要なので生成されなくなります。この結果、生成されるコードは次のようになります。
@Startup: mov dx,DGROUP mov ds,dx mov bx,ss sub bx,dx shl bx,4 mov ss,dx add sp,bx
スタックが FARSTACK の場合
.MODEL 文で FARSTACK が指定されている場合は、SS と DS の値は同じにはなりません。そのため、SS と SP を DS に合わせて調整するコードは生成されません。この結果、生成されるコードは次のものだけになります。
@Startup: mov dx,DGROUP mov ds,dx