.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