((SP)+1,(SP))←(SRC)
PUSH 指令四种格式:
PUSH reg 例: PUSH BX
PUSH mem 例: PUSH [BX] PUSH segreg 例: PUSH CS
PUSH data
data 是立即数,在8086/8088 中不允许。
(2)POP出栈指令 格式:POP DST
操作:(DST)←((SP)+1,(SP))
(SP)←(SP)+2
POP 指令允许的格式:
POP reg 例 : POP DX POP mem 例: POP VALUE POP segreg segreg不能用 CS 例: POP DS —— 正确
POP CS —— 错误
注意:
(1)堆栈的存取必须以字为单位,操作数SRC、DST必须是字、双字或四字,可以用各种寻址方式,8086/8088中不能用立即数。
25
(2)PUSH和POP操作不影响标志位。
例3.29 PUSH AX
若指令执行前(SS)= 3000H
(SP)= 100H (AX)= 2107H
指令执行情况如图3.10所示。 堆栈段 堆栈段
低地址
(SS) (SS) 07H (SP) 21H 进栈方向 (SP) 高地址
执行后 执行前
图3.10 PUSH AX执行情况
可见:指令执行后,AX的高字节存入堆栈的高地址中,低字节存入低地址中,SS值不变,SP
26
值减2。
此时(SP)= 100H –2 = 0FEH, 指向栈顶元素07H。
例3.30 POP AX
若指令执行前(SS)= 3000H,(SP)= 0FEH,AX值未知。
指令执行后,将栈顶元素07H送入AL,将栈顶地址加1单元内容送入AH,
则(AX)= 2107H,SS值不变,SP值加2, 此时(SP)= 0FEH + 2 = 100H
指令执行情况如图3.11所示。
27
(SS) (SS) 低地址
(SP) 07H 21H 执行前
(SP) 07H 21H 执行后
高地址 出栈方向
图3.11 POP AX执行情况
堆栈在汇编语言程序设计中起着重要的作用,它可以保存、恢复寄存器中的内容;在子程序和中断程序中,用堆栈保存返回地址,保护和恢复CPU工作寄存器内容,形式如:
PUSH AX ;保护AX、BX内容 PUSH BX
;中间程序用到AX、BX POP BX ;恢复AX、BX原来内容 POP AX
3、交换指令 XCHG
格式:XCHG OPR1,OPR2 操作:(ORP1)?(OPR2)
该指令交换二个操作数的内容,二个操作数中,必须有一个在寄存器中,不允许使用段寄存器和立即数。
例3.34 XCHG BX,[BP+SI] 指令执行前: (BX)= 6F30H,(BP)= 0200H, (SI)= 0046H,(SS)= 2F00H, 字(2F246H)= 4154H
28