←前ページへ :  INDEX :  次へ→


4-8.PUSH, POP

  スタック領域は「CALL」「RET」命令のためだけの領域ではない。スタック領域を使える命令はほかに「PUSH」「POP」命令がある。これはレジスタを一時的に保管する命令と、それを戻す命令である。

PUSH	SRC

   動作:SPを2減らし、SS:SPにSRCを格納
  影響を受けるフラグ:なし
    SRC:レジスタ(16bit、32bitのみ)、セグメントレジスタ、メモリー(16bit、32bitのみ)
POP	DEST

   動作:SS:SPの内容をDESTに代入し、SPを2増やす
  影響を受けるフラグ:なし
    DEST:レジスタ(16bit、32bitのみ)、セグメントレジスタ、メモリー(16bit、32bitのみ)


プッシュ 【86】
【書式】
 PUSH  source
 source = reg16/reg32/meml6/mem32/segreg           = imm8/imml6/imm32 【186】
【フラグ】
OF DF IF TF SF ZF ?? AF ?? PF ?? CF
【動作】
スタックが32ビット属性のセグメントの場合、以下のSPはESPになります。
SPからsource のサイズに従って2または4を減算します。
SPSP − 2または4
source からSS:[SP]にsource のサイズに従い2バイトまたは4バイトのデータをコピーします。
SS:[SP]source
【備考】
  • SPのプッシュでは8086/8088の場合は2の減算後の値が、それ以外では減算前の値がプッシュされます。

ポップ 【86】
【書式】
 POP  dest
 dest = reg16/reg32/mem16/mem32/segreg(CSを除く)
【フラグ】
OF DF IF TF SF ZF ?? AF ?? PF ?? CF
【動作】
スタックが32ビット属性のセグメントの場合、以下のSPはESPになります。
SS:[SP]からdest に2バイトまたは4バイト(dest のサイズ分)のデータをコピーします。
destSS:[SI]
SPにdest のサイズに従って2または4を加算します。
SPSP + 2または4
【備考】
  • dest がSSの場合、この直後の1命令の実行が終了するまですべての割り込みは保留となります。 つまり、直後の命令でSP(ESP)を設定すれば、SSとSP(ESP)を正常に変更できことになります。 POP以外の場合、スタック領域の設定ではLSS命令が適しています。
  • 0〜3の範囲のセレクタをセグメント レジスタに取得しても、参照されなければ例外割り込みは発生しません。

←前ページへ :  INDEX :  次へ→