4、堆栈指令
在8086/8088系统中,堆栈实际是一段随机访问RAM区域。
称为栈底的一端地址较大,称为栈顶的一端地址较小。
堆栈的段值在堆栈寄存器SS中
堆栈的指针寄存器SP始终指向栈顶
堆栈是以“后进先出”方式工作
堆栈的存取必须以字为单位(16bit = 2Btye)
堆栈的指令分为如下两种:
(1)进栈指令PUSH
格式如下:PUSH SRC(源操作数)
该指令把源操作数SRC压栈。
执行过程是:先把栈顶指针SP值减2,SP = SP-2
再把SRC中的值放入SP所指的栈顶中即 [SS*16+SP] = [SRC]
SRC可以是通用寄存器和段寄存器,也可以是字存储单元
(2)出栈指令POP
格式如下:POP DST(目的操作数)
该指令把栈顶的元素放到DST中,然后把SP加2
执行过程如下:先把堆栈指针SP指的数据放到DST中,【DST】=【SS*16+SP】
再使SP = SP + 2
DST可以是通用寄存器和段寄存器(但是CS除外),也可以是字存储单元。
注意:
(1)上面两条指令PUSH和POP只能是字操作
(2)可以使用除立即寻址外的其他任何方式
(3)POP指令不允许使用CS寄存器
此两条指令不影响FLAG标志位
利用这两条指令可以是实现两个段寄存器的数据交换
例如:实现DS、ES的数据交换
PUSH DS
PUSH ES
POP DS
POP ES
在汇编的过程中,堆栈操一般实现“现场保存”和“现场恢复”,作为参数的传递缓冲区等。
汇总:
数据交换有三种方式:
传送指令、交换指令、堆栈指令
举例:交换DS、AX的数据
利用传送指令
MOV BX,AX
MOV AX,DS
MOV DS,BX
利用交换指令
XCHG AX,DS<不能同时是段寄存器>
利用堆栈操作指令如上面的示例。
5、标志操作指令
(1)标志传送指令
1、LAHF(Load AH Flags)
把FLAG寄存器的低八位送到AH,即把CF PF AF ZF SF送到AH中。
不影响标志寄存器。
2、SAHF(Store AH into Flags)
把AH寄存器的八位传送到FLAG寄存器的低八位中,刚好和上面的指令作用相反。
影响标志寄存器。但是不影响8-15中的标志位。
3、PUSHF和POPF
把FLAG的标志寄存器压入和压出。
可以通过他们的操作来改变FLAG中的标志位的值。主要可以改变TF标志。