2024年3月24日发(作者:)

堆栈是一种数据结构。一直以为堆栈是一个寄存器,惭愧!教科书定义:所谓堆栈,就

是只允许在其一端进行数据插入和数据删除的线性表。51单片机的单片机的堆栈是在内部

RAM中开辟的。这句话表明了堆栈的位置。

那么堆栈到底有什么作用?

堆栈主要是为子程序调用和中断操作而设立的,因此对应有两项功能:保护断点和保

护现场。

单片机的程序归根结底是个死循环,反复在执行Main函数(主程序),你可以只写一个

函数Main,那么你这个函数随着功能的增多而变得异常大,而且非常不具备可读,这个时

候就需要子函数(子程序)了。主函数在调用完子函数后会返回到主函数中,这样就可以调

用其它函数并且继续这个死循环。在计算机去执行子函数或者中断服务函数,如何确保程

序能够正确地返回到主函数中并且继续正确执行后面的内容?因为在执行子函数或者中断

服务函数时,很有可能会破坏寄存器单元的内容,但这些寄存器单元在子函数必须要用到?

这个问题看起来比较难解决了。这个时候就要用到 断点保护和现场保护了。

保护断点:在调用子程序和堆栈时,将返回地址(执行完子程序或者中断后要执行的下

一个指令的的地址(PC寄存器值)) 送入堆栈,程序返回时,这个值自动弹回PC。这种方式

是自动使用堆栈的,程序中一般无需理会。在这个过程中,地址送入堆栈时,堆栈指针SP+2,

因为51的寻址范围是64KB,再查看RAM中堆栈单元就可以发现这个时候已经变成了PC

的值,在返回的时候SP-2,但是堆栈中的内容在下一次堆栈操作之前不会发生变化。来看

下面的仿真图:

程序初始化将SP设置为0x07,这个时候RAM中全部被清零。

单步运行。