欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

PUSH进栈指令和POP出栈指令

发布时间:2025/5/22 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 bxpop ax pop bx

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

mov bx,2000 mov ss,bx mov sp,10Hmov ax,001AH mov bx,001BHpush ax push bxmov ax,0 mov bx,0pop 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,axmov 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,axmov bx,1000H mov ss,bx mov sp,0pop 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]

总结

以上是生活随笔为你收集整理的PUSH进栈指令和POP出栈指令的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。