先澄清一下你问得模糊的地方。
1、你说的“RST”返回指令应该是“RET”吧?
2、“SP”不叫堆栈指令,它是堆栈指针,估计是Stack Pointer的首字母。
该指针总是指向堆栈的栈顶,即始终存放的是栈顶的地址。
堆栈的工作原理可简述为“后进先出”,即LIFO,last-in-first-out。(具体解释请查阅相关资料)
不同的处理器所支持的汇编指令助记符不尽相同,但是他们的含义有相似性。
下面就以RET来说说吧。
RET在51指令系统里其含义是子程序返回。在用LCALL或ACALL指令调用子程序的时候,堆栈指针SP先增加1,再把下一条将要被执行的程序计数器PC的值存入SP(这一步保证了子程序结束能正常返回原程序),然后存放子程序的存储空间的首地址被送入PC,于是CPU可以执行子程序中的代码。
在子程序结束时,要用RET指令结束,它的作用是将SP中的内容弹出到PC中。SP的内容弹出后,SP自减1,即恢复到调用子程序前的状态。由于SP中的内容(即子程序调用前将要被执行的指令)又回到PC中,所以原程序会继续进行。
至于SP的地址,系统复位后,SP被初始化为07H,使得堆栈区从08H开始。当然用户也可以自己设置SP的地址,只不过要注意不要将堆栈区与其它的存储区冲突。
返回指令是相对调用指令而言的,在执行调用指令时,就会将主程序中调用指令的下一条指令的地址(在PC寄存器中)自动压入到堆栈中保存起来,当子程序运行结束后,会安排一条返回指令(目地就是为了返回到主程序中相应调用指令的下一条指令),执行返回指令,会自动从堆栈中将先前保存的下条指令地址弹出到程序计数器PC中。
从被调用过程返回到调用点是通过ret指令来实现的,执行ret指令时,cpu自动从栈顶弹出一个字送给指令指针寄存器ip,返回地址是cpu通过堆栈操作自动提供的。