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。


发布评论