最初の行の .386 という擬似命令は、80386 以降の CPU の命令を使用許可するものです。これを指定することで、32 BIT レジスタが使用できるようになるほか、80386で新しく付け加わった命令が使用できるようになります。今回のケースでも、32 BIT のeax レジスタを使用しますので必要です。ここで、386 以上の命令も使用許可する場合には、.486や.Pentium,.PentiumPro などを使用することも出来ます。一般に、80486 以降と、80386 以前ではそれほど大幅な変更点は無いと考えられていますが、80486 ではキャッシュ制御命令のほか、整数命令などでも重要な命令が追加されています。Pentium や PentiumPro でも、使いこなせば重要な命令の追加があります。また、MMX 命令も許可する場合は、.MMX を指定します。AMD の Athlon 等では 3DNow! 命令が追加されていますが、それらの命令を使用する際には、.3DNow を指定します。
次の行の、.model 擬似命令は、メモリモデルと、アセンブラと共に使用する高級言語の種類を指定します。nwsa では、現在C言語呼び出しにしか正式には対応していません。また、メモリモデルというのは、16 BIT プログラムを作る場合以外には関係ありません。またメモリモデルを指定しても、簡易セグメント擬似命令を使用しなければ何の効果もありません。今回の場合、smallの部分がメモリモデルを指定していますが、他に、large,compact,medium,huge 等が指定できますが、Windows 95/98/Me/NT/2000 用のプログラムを作る際にはほとんど関係ありません。必ず small を指定すると考えてください。この指定は、PROC 擬似命令でnearやfar指定を省略した場合などに影響を与えますが、省略しない場合は意味を持ちません。最近の MASM では、FLAT という指定も出来るようですが、nwsa ではまだ対応していません。カンマで区切られた第二パラメータの c の部分が高級言語の種類を表しています。これで、C言語のインターフェースを使用することを宣言しています。C言語のデフォルトの呼び出しに対応しています。C言語では、一般に、_cdecl 呼び出しと、_stdcall 呼び出しの二つが使用されます。何も指定しなければ、_cdecl 呼び出しになりますが、先の例では、念のため関数のプロトタイプ宣言で、_cdecl キーワードで関数を修飾し、そのことを明示していました。_cdecl 呼び出しは、スタックの管理を全て呼び出し側が行う方式です。例えば、2つのDWORDパラメータをスタックにpushした場合には、責任を持って2*4=8 バイト分のスタックの除去を呼び出し側が行います。この方式は可変長の引数を呼び出し側がpushした場合に呼び出された側がスタックの管理をミスするのを防ぐ働きがあり安全性が高い方法です。一方、_stdcall 呼び出しでは、呼び出された側がスタックの除去を行います。この方式の利点はスタックを除去するコードの量を減らせることにあります。ただし、呼び出し元の push したスタックの量と呼び出された側がスタックポインタを add する量とが完全に一致していなければならず、注意が必要です。Windows API は、基本的に _stdcall 呼び出しを使用しています。
さらに次の行の、_text segment para use32 は、セグメント擬似命令です。この命令はend文の直前の _text ends 命令と対応し、この間に囲まれた部分のコードを指定したセグメントに収めることを指示する命令です。para は、セグメントの先頭アドレスのアラインメントを指定していますが、通常は気にしないで下さい。use32 は、このセグメントが 32 BIT セグメントであることを示します。他に use16 というものがありますがこちらは 16 BIT セグメントであることを示します。このUSE指定は非常に重要で、現在のWindows では特殊な場合を除いて必ず USE32 を指定する必要があります。32 BIT セグメントと 16 BIT セグメントは、386 系のセグメントディスクリプタによって完全に区別されます。32 BIT セグメント内部の命令では、デフォルトで 32 BIT 幅のデータ転送を行い、アドレス計算も 32 BIT で行われます。レジスタも EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,EIP
が使用されます。逆に 16 BIT セグメント内部ではデフォルトでデータ幅が16 BIT、アドレス計算も 16 BIT で行われます。ただし、いずれの場合でも命令の先頭にプリフィクスバイトというものを付加することでデフォルトの指定を反転させることが可能です。バス幅に関連したプリフィクスバイトには2種類有り、データ転送の幅を反転するものと、アドレス計算の幅を反転するものとがあります。これらのプリフィクスはアセンブラによって自動的に挿入されますので、nwsa を使用するユーザーは普段は何も気にする必要はありません。ただし、USE32の指定がなぜ重要かは知っておいてください。例えば、USE32 指定のセグメント内でeax レジスタを使用する命令を書いた時には、データ幅反転プリフィクスは付きません。ところが、USE32 指定のセグメント内でax レジスタを使用する命令を書いた場合は自動的にデータ幅反転プリフィクスが付加されます。現在の32BIT- Windows ではこのセグメントは正しく実行されます。ところが、仮にこのコードが実際には、16 BIT のセグメントで走行した場合には、eax を使うはずの命令が ax を使い、ax を使うはずの命令が eax を使用してしまいます。つまり、USE32 を指定した論理セグメントは、実行段階でも 32 BIT セグメントで実行されなければならないのです。アドレス幅変更プリフィクスの場合も全く同様なことが起こります。重要なことは細部を理解することではなく、今言ったようなUSE32 指定の概略的な意味を知っておくことです。
Visual C++ では、C や C++ のソースファイル中に _asm 構文によってインラインアセンブラが使用できますが、単体のアセンブラが使用したくなるケースもあります。例えば、構造体をインラインアセンブラで使用することはできませんが、単体のアセンブラでは、struc, ends 構文にて使用できます。