🌵🌵🌵前言
✨你好啊,我是“ 怪& ”,是一名在校大学生哦。
🌍主页链接:怪&的个人博客主页
☀️博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
💪很高兴与你相遇,一起加油!
一、什么是堆栈?
堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的 。堆这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。在内存储器(随机存储器)中开辟一个区域作为堆栈,叫软件堆栈;用寄存器构成的堆栈,叫硬件堆栈。
简介:
- 一种数据结构
- 堆栈的元素进出遵循:“先进后出”原则
想必大家在使用高级语言,例如:java,c,c++,python等都使用过堆栈,其运行机理大体明白,但细节部分还较模糊。
此篇文章将从《汇编语言》即计算机最底层的角度让你重新认识堆栈。
二、堆栈的前言知识
提及《汇编语言》,不可避免的要讲14个寄存器,如图 (基于8086CPU的哦)
江湖上流传着:“把这14个寄存器学明白,汇编语言就毕业了👻”的传说。
即然此文讲堆栈,则我们就需要了解:
- SS:堆栈段寄存器
- SP:堆栈指针寄存器组
8086CPU的入栈和出栈操作都是以字(word)为单位进行的。一个字(word)为两个字节(byte)。
任意时刻,SS:SP指向栈顶元素
栈为空时,SS:SP指向栈空间最高地址单元的下一个单元。(因为“任意时刻,SS:SP指向栈顶元素”,所以栈空时不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元。)
三、堆栈的操作
1、栈的初始化
mov ax,1000H
mov ss,ax ;设置栈的段地址ss=1000H,不能直接向段寄存器SS送入数据,所以用ax中转
mov sp,0010H
2、入栈
mov ax,1234
push ax
Push ax
实际是执行了两个操作:
- SP=SP-2
- 将ax内容送入SS:SP指向的内存单元中,SS:SP此时指向新栈顶
存储,遵循“高位存高位,低位存低位”的原则。
3、出栈
Pop bx
pop bx
实际是执行了两个操作:
- 将SS:SP指向的内存单元处的数据送入BX中
- SP=SP+2,SS:SP指向当前栈顶下面的单元(新的栈顶)
三、注意事项
- 汇编语言不区分大小写
- 编程时小心栈顶超界:防止“ 栈满继续入栈” 和 “ 栈空继续出栈 ”的超界现象。
- 堆栈空间也是内存空间的一部分