個別命令についての補足

PUSH/PUSHW/PUSHD

.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

[目次]