堆栈基本内容
1、堆栈的定义
• 堆栈是一个特定的存储区或寄存器,它的一端是固定的(栈底),另一端是浮动的(栈顶),主要用于函数调用、中断切换时保存和恢复现场数据及局部变量的临时保存。
• 所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”(FILO—First-In/Last-Out)的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出
• 在内存储器(随机存储器)中开辟一个区域作为堆栈,叫软件堆栈;用寄存器构成的堆栈,叫硬件堆栈。
• 单片机应用中,堆栈是个特殊存储区,堆栈属于RAM空间的一部分,堆栈堆栈中的物体具有一个特性:第一个放入堆栈中的物体总是被最后拿出来, 这个特性通常称为先进后出(FILO—First-In/Last-Out)。 堆栈中定义了一些操作, 两个最重要的是PUSH和POP。
2. 堆栈的操作
• PUSH(入栈)操作:将数据存放到堆栈中。堆栈指针(SP)加1,然后在堆栈的顶部加入一 个元素。
• POP(出栈)操作:从堆栈中弹出数据。先将SP所指示的内部ram单元中内容送入直接地址寻址的单元中(目的位置),然后再将堆栈指针(SP)减1。这两种操作实现了数据项的插入和删除。
3、堆栈长度:栈空间的大小
4、栈底(Bottom):栈底指向的是堆栈段中地址最大的字单元。
5、栈顶(Top):栈顶是堆栈指针SP指向的位置。当前栈顶字单元的逻辑地址为 SS:SP(SS为堆栈段的段基址)
6、堆栈的生长方式
• 向上生长:当压入操作后,堆栈指示器SP向地址增大方向变化。
• 向下生长:当压入操作后,堆栈指示器SP向地址减小方向变化。
绝大多数计算机采用向下生长方式。
7、空栈:
在进行堆栈操作前,为空栈。此时SP应预置一个初值。该值为堆栈空间的大小。
SP初值=堆栈空间的最大容量例:SP=0008H。则最大容量为8个字节。SP指向当前的栈顶。
8086/8088中堆栈的设置
STACK1 SEGMENT PARA STACK
DB 40H DUP(0)
STACK1 ENDS
• 定义一个段,名称为stack1,
• para表明该段起始地址对齐到para。 1 para= 16 bytes。
• stack声明该段是堆栈段
• DB表示数据的类型是字节型,x dup (z) 表示将z这个变量复制X遍,即为
stack1段分配40H(64个)字节的空间,并赋初始值为0
• segment是段定义的伪指令。在汇编中有数据段,代码段,堆栈段和附加段
• [格式]
segment_name SEGMENT 【定位类型】 【组合类型】 【类别名】
···; //here is your codesegment
ends
• 【定位类型】指明段开始的边界,如para,它使段定位在小段的边界,段首地址正好能被16整除,定位类型未指定时默认为para
• 段的定位类型有4种,分别是:page(页起始),起始地址以00H结尾,能被256整除para (节起始),起始地址以0H结尾,能被16整除word(字起始),起始地址末位为0,是偶地址byte (字节起始),起始地址为任意边界
• 【组合类型】决定本段是否要和其他段组合在一起,组合类型有:stack,common,public
• 【类别名】连接时用于相关段组合在一起,如代码段’code’,数段’Data’,堆栈段’Stack’
• 例: stack segment para stack ‘stack’
• 解释: para表明该段起始地址对齐到para。 1 para= 16 bytes。stack声明该段是堆栈段,这样在最后的链接link时,会将该最终创建的exe文件头部的SS:SP域指向该段的末尾
• ‘stack’表明该段的组合名为’stack’。同一程序不同模块中,相同组合名的段会组合到一起。组合名也
决定了最后exe文件中各个段的排列顺序
来源:oschina
链接:https://my.oschina.net/u/4408223/blog/4320294