.STARTUP

構文    .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

[目次]