2024年3月24日发(作者:)

(2)PUSH,POP

PUSH和POP是堆栈操作指令助记符。堆栈是程序在内存中开辟的一个数据区,用以

保存寄存器或存储器中暂时不用而又必须保存的数据。程序中堆栈是用段定义语句在内存中

定义的一个堆栈段,堆栈段的段基址存放在SS寄存器,段内偏移地址存放在SP寄存器中,

SP也常称为堆栈指针,它总是指向栈顶。

堆栈是一种线性表,只在栈顶(低地址端)进行输入输出操作。CPU对堆栈的操作采

用先进后出(或后进先出)存取方法。CPU把数据存入堆栈称为压入堆栈PUSH,从堆栈中

取出数据称为弹出堆栈POP。压入堆栈时堆栈增长,堆栈指针SP减小,向低地址方向移动;

弹出堆栈时堆栈减小,堆栈指针SP增大,向高地址方向(栈底)移动。如图3-6所示。

指令格式:

PUSH src ;压栈指令

POP dst ;出栈指令

PUSH指令把操作数压入堆栈,执行过程为:

① src 的高8位存入[SP-1],src 的低8位存入[SP-2]

② SP-2送 SP

例如:

设SS=2000H,SP=102H,AX=623EH,执行下面指令后:

PUSH AX

AX的数据62H存入20101H单元,3EH存入20100H单元,SP=0100H,如图3-6所示。

POP指令把操作数弹出到dst中,执行过程为:

① 把[SP]的内容弹出到dst的低8位,把[SP+1]的内容弹出到dst的高8位

② SP+2 送SP

例如:设SS=2000H,SP=102H,执行下面指令后:

POP AX

SS=2000H,SP=104H,AX=79FFH,如图3-6所示。

堆栈操作指令属于单操作数指令,操作数可以是寄存器,也可以是存储器。堆栈指令的

操作数必须是字类型,可以是16位的通用寄存器或段寄存器,也可以是两个连续的内存单

元,可以采用任何寻址方式。8086CPU不允许立即数作为堆栈操作的操作数,CS不能作为

出栈指令的操作数。堆栈指令不影响任何标志位。

例如: PUSH DI

PUSH DS

PUSH CS

PUSH WORD PTR[1000H]

PUSH WORD PTR[SI]

PUSH WORD PTR[BP+6]

POP SI

POP DS

POP WORD PTR[1000H]

POP WORD PTR[SI]

POP WORD PTR[BX+DI]

堆栈操作常用来传递函数的参数。程序中压栈操作和出栈操作常常成对出现,以保持堆

栈的平衡。

堆栈初始化

堆栈初始化应该加载堆栈段寄存器SS和堆栈指针寄存器SP。通常把堆栈段的栈底地址

装入SS。例如,如果堆栈段位于存储单元20000H~2FFFFH处,则应该设置SS=2000H,

SP=0000H。这样SP实际指向2FFFFH,因为操作时首先SP减1,然后才把第一个字节压

栈。所有的段都是自然循环的,段的顶部就是段的底部。

汇编语言中堆栈段的设置是由汇编(MASM)和连接程序(LINK)自动设置的,除非

有特殊需要改变这些初始化值,否则不必要加载SS和SP。详细解释参照4.4.1。