51单片机的堆栈指针(SP)】的更多相关文章

堆栈指针(SP,Stack Pointer),专门用于指出堆栈顶部数据的地址. 那么51单片机的堆栈在什么地方呢?由于单片机中存放数据的区域有限,我们不能够专门分配一块地方做堆栈,所以就在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢?还是不好定,因为51是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就不分了,把分的权利给用户(编程开发者),根据自已的需要去定吧,所以51单片机中堆栈的位置是…
一般编译器的堆栈用于保存局部变量.函数的参数.函数的返回值.中断上下文信息等.但Keil对局部变量.函数参数预先分配空间(放在静态全局变量区),Keil的堆栈只是用于保存函数嵌套调用的PC.中断上下文信息. 从主程序进入中断需要入栈字节数:13+PC=15 Byte(ACC,PSW,B,DPH,DPL,R0~R7) Keil支持2级中断15×2=30 Byte. 主程序中每级调用需要消耗2字节保存PC,如调用深度6级,需要6×2=12字节堆栈空间. Keil51 编译后会生成M51文件,查找?S…
引言    8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同.正确地使用变量,有利于获得高效的目标代码.下面详细介绍Keil C51中变量的使用方法. 1 CPU存储结构与变量的关系    变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同.    标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CP…
转自:http://www.eepw.com.cn/article/216237_2.htm 1.RAM keil C语言编程 RAM是程序运行中存放随机变量的数据空间.在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式. 在keil中…
data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小. bit :是指0x20-0x2f的可位寻址区idata:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同. idata是用类似C中的指针方式访问的. 汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好) xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR…
将堆栈指针SP指向128之后.如果你定义了数组.将数组定义为Idata.很难想象单个变量使用,你能用尽128个data类内存单元.如果真的用尽了,那只有将访问频率低的内存单元放到idata类去.总之,不要走极端,变量也有轻重缓急之分,不能一味追求性能将所有变量都定为data类.资料下载: http://zhidao.baidu.com/link?url=738w7dJo3-5bkJFJ4HdTo5tXOqgaZoILKkKQtN5P1OvVpdyGlYFChOv486rDeb6eHsipMGn8…
data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小. bit :是指0x20-0x2f的可位寻址区idata:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同. idata是用类似C中的指针方式访问的. 汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)  xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPT…
PC(program counter)是CPU中用于存放下一条指令地址的寄存器,SP为堆栈指针.下面将介绍函数调用过程中CPU对PC和SP这两个寄存器的操作. 假设有如下函数Fun Fun() { ………………… Sub-fun(a, b): ………………… } 当函数Fun调用其子函数sub-fun时,CPU内部执行情况如下: 1. 执行CPU指令push,将参数a.b入栈,即根据CPU SP寄存器的值,把a.b的值存入SP指向的地址,并把SP减1(栈通常从高地址向低地址生长). 2. 执行C…
1.int===2个字节 2.sfr===特殊功能寄存器,也是一种扩充数据类型,占用1个内存单元,利用它可以访问51单片机内的所有特殊功能寄存器. sfr P1 = 0x90;/////////这一句定义P1为P1端口在片内的寄存器. 3.sfr16===16位特殊功能的寄存器.用于定时器T0,T1 4.sbit===可录址位,也是一种扩充数据类型.利用它可访问芯片内部RAM中的可寻址位或特殊功能寄存器的可寻址位. sfr P1 = 0x90;/////////因P1端口的寄存器是可寻址位的,所…
In Doing We Learning 在操作中学习.如果只是光看教程,没有实际的操作,对编程语言的理解很空泛,所以决定从单片机中学习C语言. #include<reg52.h>                 //包含的头文件. sbit LED = P0^0;                         //这里就是对P0寄存器进行位操作.相当于对P0^0位赋予了一个新的名字,LED.实际上这一块可以包含在头文件中.避免重复操作.sbit ADDR0 = P1^0;sbit ADDR…