PUSH进栈指令和POP出栈指令

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
PUSH BX
POP CX
POP BX

在这里插入图片描述

以下是执行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
在这里插入图片描述
注意:

段地址:偏移地址
  SS  : SP    它们永远指向栈顶数据

例:
利用栈交换AX 和 BX中的数据

push ax
push bx

pop ax
pop bx

例:
假设AX = 001AH,BX = 001BH,然后删除成0,利用栈恢复AX和BX中的数据

mov bx,2000
mov ss,bx
mov sp,10H

mov ax,001AH
mov bx,001BH

push ax
push bx

mov ax,0
mov bx,0

pop bx
pop ax

例:
假设将 10000H -1000FH这段空间当做栈,初始状态栈是空的,此时 SS = 1000H,SP = ?

0 1 2 3 4 5 6 7 8 9 A B C D E F = 16字节
SS = 1000:0 + 10H = 1000 : 10H
SP = 10H

注:

  • 在使用堆栈的时候,需要注意栈越界问题,在汇编语言中,栈越界是没有提示的,需要自己留意。
  • 一个栈能够存放最多 32768个字型数据。
  • SP的范围为0 — FFFFH 字节。

例:
1)使其可以将 10000H — 1000FH 中的8个字型数据,逆序复制到 20000H—2000FH

10000H 23H           20000H 33H
10001H 01H           20001H 11H
10002H 66H         
10003H 22H
		........
1000CH 44H           2000CH 66H
1000DH 78H           2000EH 22H
1000EH 33H           2000EH 23H
1000FH 11H           2000FH 01H
mov ax, 1000H
mov ds,ax

mov bx,2000H
mov ss,bx
mov sp,10H
					 ;1000H * 10H + 0      10000H 中字型数据 0123H
push ds:[0]    ;    →  SS:SP-2
push ds:[2]
push ds:[4]
push ds:[6]
push ds:[8]
push ds:[A]
push ds:[C]
push ds:[E]

2)使其可以将 10000H — 1000FH 中的8个字型数据,逆序复制到 20000H—2000FH

mov ax,2000H
mov ds,ax

mov bx,1000H
mov ss,bx
mov sp,0

pop ds:[E]     ;  →  SS:SP → ds:[E]  → 2000:E  → SP + 2 
pop ds:[C]
pop ds:[A]
pop ds:[8]
pop ds:[6]
pop ds:[4]
pop ds:[2]
pop ds:[0]
  • 12
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值