8086汇编 栈操作
8086汇编 栈操作
栈结构
一、说明
栈是一种只能在一端进行插入或删除操作的数据结构。
栈有两个基本的操作:入栈和出栈。
- 入栈:将一个新的元素放到栈顶;
- 出栈:从栈顶取出一个元素。
栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。
栈的操作规则:LIFO(Last In First Out,后进先出)。
二、8086栈
8086CPU提供相关的指令,支持用栈的方式访问内存空间。
基于8086CPU的编程,可以将一段内存当作栈来使用。
栈操作
一、指令介绍
push、pop 实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。
执行push和pop指令时,SP 中的内容自动改变。
在SS,SP中存放栈顶的段地址和偏移地址,入栈和出栈指令根据SS:SP指示的地址,按照栈的方式访问内存单元。
8086CPU中,PUSH(入栈)和 POP(出栈)指令:
- push ax:将ax中的数据送入栈中
- pop ax:从栈顶取出数据送入ax
8086CPU中,有两个与栈相关的寄存器:
- 栈段寄存器SS - 存放栈顶的段地址
- 栈顶指针寄存器SP - 存放栈顶的偏移地址
- SS:SP - 指向栈顶元素。
注:(以字为单位对栈进行操作)
二、原理解析
1、例:设将10000H~1000FH内存当作栈来使用……
2、入栈操作
3、出栈操作
三、栈的说明案
1、存入栈顶指针、栈的空间为10010H~10000H。栈的偏移量每次减去获取的数据大小。
mov ax, 1000H
mov ss, ax
mov sp, 0010H
2、ax,bx,存入数据
mov ax, 001AH
mov bx, 001BH
3、将数据存入栈内、从1000FH开始存。
push ax
push bx
4、取出栈内数据存入ax,默认会取指针1000CH存入的数据,取出数据后。由于sp+2、指针发生变化指针移动到1000EH。
pop ax
pop bx
5、查看结构图
6、push、pop 指令流程
push ax
(1)SP=SP–2;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
pop ax
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
7、栈顶超界问题
当栈满的时候再使用push指令入栈, 将发生栈顶超界问题。
当栈满的时候再使用pop指令入栈, 将发生栈顶超界问题。
8086CPU不保证对栈的操作不会超界。 8086CPU 只知道栈顶在何处(由SS:SP指示),不知道程序安排的栈空间有多大。
我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;防止出栈时栈空了仍然继续出栈而导致的超界。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?