软游网-免费.绿色热门软件一站式下载-高速、纯净、安全、无捆绑

如何设置堆栈(如何设置堆栈指针)

时间:2024-09-26 12:25 点击:180 编辑:admin

1. 如何设置堆栈指针

堆栈指针SP就是指出栈顶在内部RAM块中的位置,从它可以了解到存放断点或者现场的位置,压栈后SP+1,出栈后SP-1。

2. 什么是堆栈指针

堆栈是按先进后出的的原则在内存中组织的一个存储区域。该区域一端固定一端活动,固定端称为栈底,而活动端称为栈顶。往堆栈中存入或取出信息都在栈顶进行。CPU中的堆栈指针SP始终指向栈顶,而堆栈段寄存器SS则指明了堆栈段的起始位置。

堆栈是一个重要的数据结构,它具有“先进后出”的特点,通常用来保存程序的返回地址。它主要有两大类操作:进/压栈操作和出/弹栈操作。

1)、进栈操作

PUSH

指令格式:PUSH Reg/Mem

PUSH Imm          

一个字进栈,系统自动完成两步操作:SP←SP-2,(SP)←操作数;

一个双字进栈,系统自动完成两步操作:ESP←ESP-4,(ESP)←操作数。

PUSHA

指令格式:PUSHA      

其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等压栈。

PUSHAD

指令格式:PUSHAD      

其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈。

2)、出栈操作

POP

指令格式:POP Reg/Mem

弹出一个字,系统自动完成两步操作:操作数←(SP),SP←SP+2;

弹出一个双字,系统自动完成两步操作:操作数←(ESP),ESP←ESP+4。

POPA

指令格式:POPA       

其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等弹出栈。其实,程序员不用记住它们的具体顺序,只要与指令PUSHA对称使用就可以了。

POPAD

指令格式:POPAD    

其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出栈,它与PUSHAD对称使用即可。

3. 如何设置堆栈指针大小

 堆栈是一块保存数据的连续内存。一个名为堆栈指针(SP)的寄存器指向堆栈的顶部。 堆栈的底部在一个固定的地址。

  堆栈的大小在运行时由内核动态地调整。 CPU实现指令 PUSH和POP,向堆栈中添加元素和从中移去元素。 堆栈由逻辑堆栈帧组成。 当调用函数时逻辑堆栈帧被压入栈中,当函数返回时逻辑 堆栈帧被从栈中弹出。

  堆栈帧包括函数的参数,函数地局部变量,以及恢复前一个堆栈 帧所需要的数据,其中包括在函数调用时指令指针(IP)的值。 堆栈既可以向下增长(向内存低地址)也可以向上增长, 这依赖于具体的实现。在我 们的例子中,堆栈是向下增长的。

4. 影响堆栈指针的指令有哪些

汇编语言中SP是堆栈寄存器。堆栈是一段按照后进先出原则组织起来的连续存储区域。用于程序保护或者恢复数据,或用于子程序调用及中断响应时保护与恢复现场。

SP是堆栈指针寄存器,存放着当前堆栈栈顶地址;

一般情况下,对SP有影响的指令,对SP的操作都是隐式的,即SP并不出现在指令操作数当中。要注意进出栈的匹配,否则将引起不可预期的后果。

5. 一般如何初始化堆栈指针

MCS-51单片机汇编语言中,没有SP这条指令,只有针对SP操作的指令。51单片机中SP是堆栈指针寄存器,存放着当前堆栈地址。堆栈用于存储子程序调用、中断程序调用时程序返回的地址,或者用来临时保存某一寄存器的值。除了初始化堆栈时直接给SP赋值,SP显式存在,其它的对SP有影响的指令,对SP的操作都是隐式的,就是说SP并不出现在指令操作数当中。例如: MOV SP,#80H ;初始堆栈指针,(SP)=80HLCALL XXXX;调用XXXX处的子程序,下一条指令PC值压栈,(SP)=(SP)+2NOP;子程序返回时,RET指令从堆栈中弹出PC值,所以会返回到这里,(SP)=(SP)-2PUSH ACC;累加器A的内容压栈保存,(SP)=(SP)+1POP B;堆栈内保存的累加器A的内容弹出到B寄存器中,(SP)=(SP)-1使用PUSH、POP指令使用堆栈,要注意进出栈的匹配,否则将引起不可预期的后果。

6. 堆栈指针的作用

堆栈:堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶对数据项进行插入和删除。

在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。SP的作用是在51单片机中,SP栈指针是一个专用的8位寄存器,系统复位后,SP初始化为07H,使得堆栈指针实际上是由08H单元开始。51堆栈的容量最大也不会超过128字节。

7. 堆栈指针指向

我学的是单片机。在堆栈里,sp加一,然后入栈;出栈,然后sp减一。所以新开的和销毁的内存都是当前sp指向的。我没学过编程思想,硬来答,或许不好,但是我坚信单片机和微机的原理是一样的,作为参考。

8. 影响堆栈指针的指令

在51单片机中,来SP栈指针是一个专用的8位寄存器,系统复位后,SP初始化为07H,使得堆栈指针实际上是由08H单元开始。

在响应中断或子自程序调用时,发生入栈操作,入栈的是16位PC值;51中有PUSH压入和POP弹出栈操作指令,如有必要,在中断或调用子程序时可用POSU指令把PSW或其它需要保护的寄存器的内容压入堆栈加以保护;返回前再使用POP指令把它们恢复。

9. 堆栈基指针

8086处理器均采用满递减堆栈。入栈时,先减地址,后进数据,所以因该是SP先减再压入。

相关阅读