8051存储区布局

Intel 8051 memory介绍:
8051具有4K的片上ROM,128字节的片上RAM,同时它具有64K的寻址能力,也就是可以扩展程序存储空间和数据存储空间多达64K。

1. 程序存储空间
8051有4K的片上ROM,该区域是只读的,在sdcc中,可以使用关键字__code将变量存储在该区域中,例如:
__code unsigned char test_code;

2. 数据存储空间
8051具有128字节的片上RAM,而128字节又由以下几部分组成:
1)寄存器组
寄存器组总共32字节,分为四组,每一组对应R0~R7,具体使用哪一组由寄存器PSW的RS1和RS0决定。
2)位寻址区
该区域占16字节共128位,位地址范围为0x00~0x7F。定义在该区域的变量值能有0或1两个值,如果要将变量定义在该区域中,可以使用sdcc中的__bit关键字,例如:
__bit test_bit;
3)通用的RAM
该区域占128字节中剩下的80字节。

3. 特殊功能寄存器
特殊功能寄存器位于地址范围为0x80~0xFF,8051中总共有21个特殊功能寄存器,特殊功能寄存器分布如图所示:
8051存储区布局_第1张图片


4. 关于特殊功能寄存器中的位地址和寄存器地址的疑惑?
可以参见这里: http://stackoverflow.com/questions/3074191/why-does-some-sfr-in-8051-are-bit-addressable
关于疑惑可以看一下头文件8051.h,P0寄存器位于0x80地址处,而后面定义的P0_0地址为0x80,P0_1地址为0x81,但是地址0x81又是寄存器SP的地址,这样那岂不是重复了?位地址其实可以分成两部分,字节地址和位编号,还是以P0为例,假设有位地址为0x87,那么字节地址为0x80,位编号为7,也就说使用setb和clr指令操作的是寄存器P0的第7位。


8052存储区布局:
8052是8051系列的一个子集,同8051有少许不同。8052片上ROM为8K,256字节的片上RAM,这256字节中前128字节同8051完全一样,同8051不同的是,高128字节可以作为通用的RAM来使用,那这样岂不是又和特殊功能寄存器地址冲突了?完全不会,这128字节只能使用间接寻址来访问,而特殊功能寄存器使用的是直接寻址,所以两者并不冲突。
那这里又涉及到变量的存储问题了:
关键字__data用于将变量存储在前128字节处,并且是直接寻址方式访问,也是操作速度最快的区域,例如:
__data unsigned char test_data;
使用Small Memory模式下变量的默认存储方式。
而关键字__idata使用间接寻址方式访问RAM,例如:
__idata unsigned char test_idata;
和__data关键字定义的变量不同的是,__idata关键字定义的变量存储区域更大,为256字节空间。
关键字__xdata则将变量存储外部RAM中,例如:
__xdata unsigned char test_xdata;
这也是使用Large Memory变量的默认存储方式。

对于使用Small Memory还是Large Memory模式可以使用命令行选项--model-small或--model-large来指定,默认为Small Memory模式。

你可能感兴趣的:(8051存储区布局)