.386 以上を指定している場合は、プッシュするデータのサイズを明示するために、PUSHW または PUSHD を指定できます。PUSHW は 2 バイト、PUSHD は 4 バイトのデータをプッシュします。単なる PUSH を使用すると、80286 以下および 16 ビットモード (use16) のセグメントでは 2 バイト、32 ビットモード (use32) のセグメントでは 4 バイトのデータがプッシュされます。
cs、ds などのセグメント レジスタをプッシュした場合、およびセグメント アドレスを直接プッシュした場合も、同様の基準で 2 バイトまたは 4 バイトのデータがプッシュされます。
MS-MASM 6.00AD は、この点について仕様が違います。MS-MASM 6.00AD でセグメント レジスタまたはセグメント アドレスをプッシュすると、PUSH、PUSHW、PUSHD のいずれを使用した場合でも、32 ビットモードのセグメントでは必ず 4 バイト、それ以外のセグメントでは必ず 2 バイトがプッシュされます。V2.12 以前の LASM は、MS-MASM 6.00AD と同じコードを生成していました。
例
.386 code segment use16 push cs ; 0E (push 2 bytes) pushw cs ; 0E (push 2 bytes) pushd cs ; 66 0E (push 4 bytes) code ends code segment use32 push cs ; 0E (push 4 bytes) pushw cs ; 66 0E (push 2 bytes) pushd cs ; 0E (push 4 bytes) code ends
セグメントレジスタのポップ (POPW/POPD)〔LASM〕
.386 以上を指定している場合は、セグメントレジスタをポップするときに、POPW と POPD を使用できます。セグメントレジスタを通常の POP 命令でポップすると、16 ビットセグメントでは 2 バイト、16 ビットセグメントでは 4 バイトのデータをポップするコードが生成されます。これに対して、POPW または POPD を使用した場合は、セグメントの種類にかかわりなく、指定どおりのバイト数をポップするコードが生成されます。
例
.386 code segment use16 pop ds ; 1F (pop 2 bytes) popw ds ; 1F (pop 2 bytes) popd ds ; 66 1F (pop 4 bytes) code ends code segment use32 push ds ; 1F (pop 4 bytes) pushw ds ; 66 1F (pop 2 bytes) pushd ds ; 1F (pop 4 bytes) code ends