PUSH进栈指令
- 指令格式:PUSH 源
- 指令功能:将源操作数推入堆栈。
- 源操作数可以是16位通用寄存器、段寄存器或存储器中的数据字,但不能是立即数。堆栈是以“先进后出”的方式工作的一个存储区,栈区的段地址由SS寄存器的内容确定。堆栈的最大容量可为64K,即一个段的最大容量。堆栈指针SP始终指向栈顶,其值可以从FFFEH(偶地址)开始,向低地址方向发展,最小为0。
- 每次执行PUSH操作时,先修改SP的值,使SP←SP-2后,然后把源操作数压入堆栈汇中SP指示的位置上,低位字节放在较低地址单元,高位字节放在较高地址单元。由于堆栈操作都是以字为单位进行的,所以SP总是指向偶地址单元。SS和SP的值可由指令设定。
POP出栈指令
- 指令格式:POP 目的
- 指令功能:把当前SP所指向的堆栈顶部的一个字送到指定的目的操作数中。
- 目的操作数可以是16位通用寄存器、段寄存器或存储单元,但CS不能作目的的操作数。每执行一次出栈操作,SP←SP+2,即SP向高地址方向移动,指向新的栈顶。
例: 设SS=2000H, SP=10H,AX=2233,BX=3344,CX=0000,依次执行下列指令:
注:栈的大小 = 16字节 = 8个字
以下是执行PUSH AX指令后产生的变化
SP = 0010H 转换为十进制为16
SP = 16 - 2 = 14 转换为十六进制为 E
以下是执行PUSH BX指令后产生的变化
SP = 000EH 转换为十进制为 14
SP = 14 - 2 = 12 转换为十六进制为 C
以下是执行POP CX指令后产生的变化
SP = 000CH 转换为十进制为 12
SP = 12 + 2 = 14 转换为十六进制为 E
以下是执行POP CX指令后产生的变化
SP = 000EH 转换为十进制为14
SP = 14 + 2 = 16 转换为十六进制为 10H
注意:
例:
利用栈交换AX 和 BX中的数据
例:
假设AX = 001AH,BX = 001BH,然后删除成0,利用栈恢复AX和BX中的数据
例:
假设将 10000H -1000FH这段空间当做栈,初始状态栈是空的,此时 SS = 1000H,SP = ?
注:
- 在使用堆栈的时候,需要注意栈越界问题,在汇编语言中,栈越界是没有提示的,需要自己留意。
- 一个栈能够存放最多 32768个字型数据。
- SP的范围为0 — FFFFH 字节。
例:
1)使其可以将 10000H — 1000FH 中的8个字型数据,逆序复制到 20000H—2000FH
2)使其可以将 10000H — 1000FH 中的8个字型数据,逆序复制到 20000H—2000FH