第三章 IMB PC机的指令系统和寻址方式 下载本文

((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