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先减再压入。