STC8G2K64S4-48PIN 系列、STC8G2K64S2-48PIN 系列单片内部集成了 64K 字节【0000H-FFFFH】的 Flash 程序存储器(ROM)。
1:单片机复位后,程序计数器(PC)的内容为 0000H,从 flash的0000H 单元开始执行程序。【PC是一个16位的计数器。用于存放和指示下一条要执行的指令的地址。寻址范围达64KB。PC有自动加1功能,以实现程序的顺序执行。PC没有地址,是不可寻址的,无法用指令对它进行读写。但在执行转移、调用、返回等指令时能自动改变其内容,以改变程序的执行顺序。】
2:另外中断服务程序的入口地址(又称中断向量)也位于程序存储器单元。在程序存储器中,每个中断都有一个固定的入口地址,当中断发生并得到响应后,单片机就会自动跳转到相应的中断入口地址去执行程序。外部中断 0(INT0)的中断服务程序的入口地址是 0003H,定时器/计数器 0(TIMER0)中断服务程序的入口地址是 000BH,外部中断 1(INT1)的中断服务程序的入口地址是 0013H,定时器/计数器 1(TIMER1)的中断服务程序的入口地址是 001BH 等。
3:由于相邻中断入口地址的间隔区间仅仅有 8 个字节,一般情况下无法保存完整的中断服务程序,因此在中断响应的地址区域存放一条无条件转移指令,指向真正存放中断服务程序的空间去执行。
51单片机是冯诺依曼架构?硬件寄存器、flash【程序】、ram【数据】各自有自己的地址,好像都是从0开始。
内部 RAM 中的 30H~FFH 单元是用户 RAM 和堆栈区。一个 8 位的堆栈指针(SP),用于指向堆栈区。单片机复位后,堆栈指针 SP 为 07H,指向了工作寄存器组 0 中的 R7,因此,用户初始化程序都应对 SP 设置初值,一般设置在 80H 以后的单元为宜。
堆栈指针是一个 8 位专用寄存器。它指示出堆栈顶部在内部 RAM 块中的位置。系统复位后,SP 初始化位 07H,使得堆栈事实上由 08H 单元开始,考虑 08H~1FH 单元分别属于工作寄存器组 1~3,若在程序设计中用到这些区,则最好把 SP 值改变为 80H 或更大的值为宜。STC8 系列单片机的堆栈是向上生长的,即将数据压入堆栈后,SP 内容增大。
堆栈介绍
https://blog.csdn.net/crjmail/article/details/79267053
堆栈是一种数据结构。一直以为堆栈是一个寄存器,惭愧!教科书定义:所谓堆栈,就是只允许在其一端进行数据插入和数据删除的线性表。51单片机的单片机的堆栈是在内部RAM中开辟的。这句话表明了堆栈的位置。
那么堆栈到底有什么作用?
堆栈主要是为子程序调用和中断操作而设立的,因此对应有两项功能:保护断点和保护现场。
单片机的程序归根结底是个死循环,反复在执行Main函数(主程序),你可以只写一个函数Main,那么你这个函数随着功能的增多而变得异常大,而且非常不具备可读,这个时候就需要子函数(子程序)了。主函数在调用完子函数后会返回到主函数中,这样就可以调用其它函数并且继续这个死循环。在计算机去执行子函数或者中断服务函数,如何确保程序能够正确地返回到主函数中并且继续正确执行后面的内容?因为在执行子函数或者中断服务函数时,很有可能会破坏寄存器单元的内容,但这些寄存器单元在子函数必须要用到?这个问题看起来比较难解决了。这个时候就要用到 断点保护和现场保护了。