java unsigned charr code a 100;这句话用的code把a定义在什么存储器并赋值

以上内容摘取自《2015年全国大学生电子设计大赛(A题:正弦信号发生器).doc》,若想查看原文格式,请如果您觉得不放心或未尽人意,请复制链接到电脑端访问(同时支持支付宝和微信支付)。新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID9534858空间积分0 积分6阅读权限10帖子精华可用积分6 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 6, 距离下一级还需 194 积分
帖子主题精华可用积分6 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
定义了一个结构体
typedef struct HWID
& & & & unsigned char*& & & & bHwid[16];
再定义一个vevtor
typedef std::vector&HWID&& & & & ArrH
我想手动往ArrHwid中添加数据,应该怎么加?
我是C++新手,HWID结构体中的bHwid我不知道怎么赋值。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分1209阅读权限30帖子精华可用积分1209 信誉积分1053 专家积分0 在线时间2964 小时注册时间最后登录
家境小康, 积分 1209, 距离下一级还需 791 积分
帖子主题精华可用积分1209 信誉积分1053 专家积分0 在线时间2964 小时注册时间最后登录
论坛徽章:0
本帖最后由 greensnow 于
21:06 编辑
那是个char指针的数组
UID9534858空间积分0 积分6阅读权限10帖子精华可用积分6 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 6, 距离下一级还需 194 积分
帖子主题精华可用积分6 信誉积分100 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
我要想往vector ArrHwid中加数据该怎么操作?
UID空间积分0 积分76阅读权限10帖子精华可用积分76 信誉积分131 专家积分0 在线时间183 小时注册时间最后登录
白手起家, 积分 76, 距离下一级还需 124 积分
帖子主题精华可用积分76 信誉积分131 专家积分0 在线时间183 小时注册时间最后登录
论坛徽章:0
unsigned char*& &bHwid[16];
我咋觉着 bHwid是个指针捏?
bHwid是个指针,指向存放着16个unsigned char 类型的数据。
换句话说,bHwid是指向一维数组的指针,这个一维的数组的大小是16,这个一维数组存放着unsiged char类型的数据。
arr.push_back(a);
(仅供参考,嘎嘎)
只有用C/C++编程的人才能称为Engineer、
MeiStudios
UID空间积分0 积分64阅读权限10帖子精华可用积分64 信誉积分100 专家积分0 在线时间55 小时注册时间最后登录
白手起家, 积分 64, 距离下一级还需 136 积分
帖子主题精华可用积分64 信誉积分100 专家积分0 在线时间55 小时注册时间最后登录
论坛徽章:0
unsigned char*& &bHwid[16];
我咋觉着 bHwid是个指针捏?
bHwid是个指针,指向存放着16个unsigned char&&...
zoelakes 发表于
& & 你的理解好想不对。你说的应该是unsigned char(*bHwid)[16]
这个网站貌似可以简单这样的类型定义问题:
UID空间积分0 积分76阅读权限10帖子精华可用积分76 信誉积分131 专家积分0 在线时间183 小时注册时间最后登录
白手起家, 积分 76, 距离下一级还需 124 积分
帖子主题精华可用积分76 信誉积分131 专家积分0 在线时间183 小时注册时间最后登录
论坛徽章:0
你的理解好想不对。你说的应该是unsigned char(*bHwid)[16]
这个网站貌似可以简单这样的类型定 ...
meistudios 发表于
哦哦,meistudios你是对的,把结合性搞乱了、
希望LZ别被我弄乱了、呵呵、有点儿误人子弟了、
只有用C/C++编程的人才能称为Engineer、
UID空间积分0 积分76阅读权限10帖子精华可用积分76 信誉积分131 专家积分0 在线时间183 小时注册时间最后登录
白手起家, 积分 76, 距离下一级还需 124 积分
帖子主题精华可用积分76 信誉积分131 专家积分0 在线时间183 小时注册时间最后登录
论坛徽章:0
更正下儿:
unsiged char *bHwid[16];
应该说 bHwid是个数组,数组里放着unsiged char*类型的数据,它的概念模型可能会是这样儿,
& & char *,
& & char *,
记得【C专家编程】里有一节说什么锯齿状数组、指针的,可以看看那个。
meistudios 可得再要帮我看看说的哪些不对呢。
只有用C/C++编程的人才能称为Engineer、
UID空间积分0 积分21阅读权限10帖子精华可用积分21 信誉积分100 专家积分0 在线时间10 小时注册时间最后登录
白手起家, 积分 21, 距离下一级还需 179 积分
帖子主题精华可用积分21 信誉积分100 专家积分0 在线时间10 小时注册时间最后登录
论坛徽章:0
LZ你这样很难搞啊,比如下面这个例子:#include &iostream&
#include &vector&
struct HWID {
& & unsigned char *bHwid[16];
};
typedef vector&HWID& ArrH
int main(void)
{
& & ArrH
& & HWID
& & for (int i = 0; i != 16; ++i)
& & {
& && &&&h.bHwid[i] =
& & }
& & arr.push_back(h);
& & for (int i = 0; i != 16; ++i)
& & {
& && &&&delete h.bHwid[i];
& & }
& & for (int i = 0; i != 16; ++i)
& & {
& && &&&*(arr[0].bHwid[i]) = 20;
& & }
& & return 0;
}复制代码不行的呀,你这样无法管理的呀,要弄一个类才比较好啊。trackbacks-0
data,bdata,idata,pdata,xdata,code存储类型与存储区
是在内部数据存储空间中&20H&..&2FH&区域中一个位的地址,或者&8051&位可寻址&SFR&的一个位地址。
code是在&0000H&..&0FFFFH&之间的一个代码地址。
是在&0&到&127&之间的一个数据存储器地址,或者在&128&..&255&范围内的一个特殊功能寄存器(SFR)地址。
idata是&0&to&255&范围内的一个&idata&存储器地址。
xdata&是&0&to&65535&范围内的一个&xdata&存储器地址。
指针类型和存储区的关系详解
一、存储类型与存储区关系
&&&&data&&&&&---&&&&&可寻址片内ram&&&&bdata&&&&---&&&&&可位寻址的片内ram&&&&idata&&&&---&&&&&可寻址片内ram,允许访问全部内部ram&&&&pdata&&&&---&&&&&分页寻址片外ram&(MOVX&@R0)&(256&BYTE/页)&&&&xdata&&&&---&&&&&可寻址片外ram&(64k&地址范围)&&&&code&&&&&---&&&&&程序存储区&(64k&地址范围),对应MOVC&@DPTR
二、指针类型和存储区的关系
&&&&对变量进行声明时可以指定变量的存储类型如:&&&&uchar&data&x和data&uchar&x相等价都是在内ram区分配一个字节的变量。
&&&&同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的使用如:
&&&&uchar&xdata&*&data&pstr
&&&&是指在内ram区分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向xdata区("*"前xdata关键字的作用),可能初学C51时有点不好懂也不好记。没关系,我们马上就可以看到对应&*&前后不同的关键字的使用在编译时出现什么情况。
&&&&......&&&&uchar&xdata&tmp[10];&&&&//在外ram区开辟10个字节的内存空间,地址是外ram的0x9&&&&......
&&&&第1种情况:
&&&&uchar&data&*&data&&&&&pstr=
&&&&首先要提醒大家这样的代码是有bug的,&他不能通过这种方式正确的访问到tmp空间。&为什么?我们把编译后看到下面的汇编代码:
&&&&MOV&0x08,#tmp(0x00)&&&&&&&&;0x08是指针pstr的存储地址
&&&&看到了吗!本来访问外ram需要2&byte来寻址64k空间,但因为使用data关键字(在"*"号前的那个),所以按KeilC编译环境来说就把他编译成指向内ram的指针变量了,这也是初学C51的朋友们不理解各个存储类型的关键字定义而造成的bug。特别是当工程中的默认的存储区类为large时,又把tmp[10]&声明为uchar&tmp[10]&时,这样的bug是很隐秘的不容易被发现。
&&&&第2种情况:
&&&&uchar&xdata&*&data&&&&&pstr&=&
&&&&这种情况是没问题的,这样的使用方法是指在内ram分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向xdata区("*"前xdata关键字的作用)。编译后的汇编代码如下。
&&&&MOV&0x08,#tmp(0x00)&&&&&&&&;0x08和0x09是在内ram区分配的pstr指针变量地址空间&&&&MOV&0x09,#tmp(0x00)
&&&&这种情况应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了,请大家记住他。
&&&&第3种情况:
&&&&uchar&xdata&*&xdata&&&&&pstr=
&&&&这中情况也是对的,但效率不如第2种情况。编译后的汇编代码如下。
&&&&MOV&DPTR,&#0x000A&&&&&&&&;0x000A,0x000B是在外ram区分配的pstr指针变量地址空间&&&&MOV&A,&#tmp(0x00)&&&&MOV&@DPTR,&A&&&&INC&DPTR&&&&MOV&A,&#tmp(0x00)&&&&MOVX&@DPTR,&A
&&&&这种方式一般用在内ram资源相对紧张而且对效率要求不高的项目中。
&&&&第4种情况:
&&&&uchar&data&*&xdata&&&&&pstr=
&&&&如果详细看了第1种情况的读者发现这种写法和第1种很相似,是的,同第1&种情况一样这样也是有bug的,但是这次是把pstr分配到了外ram区了。编译后的汇编代码如下。
&&&&MOV&DPTR,&#0x000A&&&&&&&&;0x000A是在外ram区分配的pstr指针变量的地址空间&&&&MOV&A,&#tmp(0x00)&&&&MOVX&@DPTR,&A
&&&&第5种情况:
&&&&uchar&*&data&&&&&pstr=
&&&&大家注意到"*"前的关键字声明没有了,是的这样会发生什么事呢?下面这么写呢!对了用齐豫的一首老歌名来说就是&&请跟我来&,请跟我来看看编译后的汇编代码,有人问这不是在讲C51吗?&为什么还要给我们看汇编代码。C51要想用好就要尽可能提升C51编译后的效率,看看编译后的汇编会帮助大家尽快成为生产高效C51代码的高手的。还是看代码吧!
&&&&MOV&0x08,&#0X01&&&&&&&&&&&&;0x08-0x0A是在内ram区分配的pstr指针变量的地址空间&&&&MOV&0x09,&#tmp(0x00)&&&&MOV&0x0A,&#tmp(0x00)
&&&&注意:这是新介绍给大家的,大家会疑问为什么在前面的几种情况的pstr指针变量都用2&byte空间而到这里就用3&byte空间了呢?这是KeilC的一个系统内部处理,在KeilC中一个指针变量最多占用&3&byte空间,对于没有声明指针指向存储空间类型的指针,系统编译代码时都强制加载一个字节的指针类型分辩值。具体的对应关系可以参考KeilC的help中C51&User's&Guide。
&&&&第6种情况:
&&&&uchar&*&&&&&pstr=
&&&&这是最直接最简单的指针变量声明,但他的效率也最低。还是那句话,大家一起说好吗!编译后的汇编代码如下。
&&&&MOV&DPTR,&#0x000A&&&&&&&&;0x000A-0x000C是在外ram区分配的pstr指针变量地址空间&&&&MOV&A,&#0x01&&&&MOV&@DPTR,&A&&&&INC&DPTR&&&&MOV&DPTR,&#0x000A&&&&MOV&A,&#tmp(0x00)&&&&MOV&@DPTR,&A&&&&INC&DPTR&&&&MOV&A,&#tmp(0x00)&&&&MOVX&@DPTR,&A
&&&&这种情况很类似第5种和第3种情况的组合,既把pstr分配在外ram空间了又增加了指针类型的分辨值。
&&&&小结一下:大家看到了以上的6种情况,其中效率最高的是第2种情况,既可以正确访问ram区又节约了代码,效率最差的是第&6种,但不是说大家只使用第2种方式就可以了,还要因情况而定,一般说来应用51系列的系统架构的内部ram资源都很紧张,最好大家在定义函数内部或程序段内部的局部变量使用内ram,而尽量不要把全局变量声明为内ram区中。所以对于全局指针变量我建议使用第3&种情况,而对于局部的指针变量使用第2种方式。
startup.a51的作用和&汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned&char&data&xxx="100";,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51&==变量的初始化)。&这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。有人喜欢改&startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量,&但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。,&为什么还要去改?&可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性&
8051&特有的内存型态&code以MOVC&@A+DPTR&读取的程序内存&data可以直接存取的内部数据存储器&idata以Mov&@Rn&存取的内部数据存储器&bdata可以位寻址(Bit&Addressable)的内部存储器&xdata以MOVX&@DPTR&存取的外部数据存储器&pdata以MOVX&@Rn&存取的外部数据存储器&特殊资料型态&bit一般位(bit)变量&sbit绝对寻址的位(bit)变量&语法&sbitmy_flag=(location&范围从0x00&~&0x7F)&范例&sbitEA&=0xAF;&或是配合bdata&宣告的位(bit)变量&charbdatamy_&sbitflag0&=my_flags&^&0;&(注意sbit&前不可以加static)&sfr特殊功能缓存器(Special&Register)&语法&sfrmy_sfr=(location&范围从0x80&~&0xFF)&范例&sfrP0=0x80;&指定绝对地址的变量&在单一模块内可以使用下面的语法宣告&[memory_space]typevariable_name_at_location&范例&pdatacharmy_pdata_at_0x80;&如果该变量必须为多个模块所使用(Global&Variable)则以&抽象指针(Abstract&Pointer)的方式在标头档(Header&File)定义较为方便。&#definevariable_name*((data_type&*)location)&范例&#definemy_pdata*((char&pdata&*)0x80)&(注意char&与pdata&的顺序)&ABSACC.H&提供了下列方便的宏(Macro)定义。&#define&CBYTE&((unsigned&char&volatile&code&*)&0)&#define&DBYTE&((unsigned&char&volatile&data&*)&0)&#define&PBYTE&((unsigned&char&volatile&pdata&*)&0)&#define&XBYTE&((unsigned&char&volatile&xdata&*)&0)&#define&CWORD&((unsigned&int&volatile&code&*)&0)&#define&DWORD&((unsigned&int&volatile&data&*)&0)&#define&PWORD&((unsigned&int&volatile&pdata&*)&0)&#define&XWORD&((unsigned&int&volatile&xdata&*)&0)&隐藏的初始化程序&80C51&在电源重置后(Power&On&Reset)所执行的第一个程序模块并不是使用者的主程序&main(),而是一个隐藏在KEIL-C51&标准链接库中称为startup.a51&的程序模块。&startup.a51&的主要工作是把包含idata、xdata、pdata&在内的内存区块清除为0,并&且初始化递归指针。接着startup.a51&被执行的仍然是一个隐藏在KEIL-C51&标准链接库&中称为init.a51&的程序模块。而init.a51&的主要工作则是初始化具有非零初始值设定的&变量。&在完成上述的初始化程序之后,80C51&的控制权才会交给main()&开始执行使用者的程序。&#define&XBYTE&((unsigned&char&volatile&xdata&*)&0)定义&&&&XBYTE&为&指向&xdata&地址空间unsigned&char&数据类型的指针,指针值为0&这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了
阅读(...) 评论()C51存储器类型与51单片机的物理区域 - 电子技术基础知识 - 21IC中国电子网
您当前的位置:&>&&>&&>&
C51存储器类型与51单片机的物理区域
1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。
2、 data区内最好放局部变量。
因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;
扩展阅读:
3、 确保你的程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。
4、 程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间。
在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。定义方法是: bdata bit LedS但位类型不能用在数组和结构体中。
5、 其他不频繁用到和对运算速度要求不高的变量都放到xdata区。
6、 如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。
7、 当使用到指针时,要指定指针指向的内存类型。在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为: char data *p;。还可指定指针本身的存放内存类型,如:char data *。其含义是指针p指向data区变量,而其本身存放在xdata区。
bit---是在内部数据存储空间中 20H .. 2FH 区域中一个位的地址,或者 8051 位可寻址 SFR 的一个位地址。
code---是在 0000H .. 0FFFFH 之间的一个代码地址。
data---是在 0 到 127 之间的一个数据存储器地址,或者在 128 .. 255 范围内的一个特殊功能寄存器(SFR)地址。
idata---是 0 to 255 范围内的一个 idata 存储器地址。
xdata 是 0 to 65535 范围内的一个 xdata 存储器地址。
指针类型和存储区的关系详解
一、存储类型与存储区关系
data ---& 可寻址片内ram
bdata ---& 可位寻址的片内ram
idata ---& 可寻址片内ram,允许访问全部内部ram
pdata ---& 分页寻址片外ram (MOVX @R0) (256 BYTE/页)
xdata ---& 可寻址片外ram (64k 地址范围)
code ---& 程序存储区 (64k 地址范围),对应MOVC @DPTR
二、指针类型和存储区的关系
对变量进行声明时可以指定变量的存储类型如:
uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。
同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的使用如:
uchar xdata * data pstr
是指在内ram区分配一个指针变量(&*&号后的data关键字的作用),而且这个指针本身指向xdata区(&*&前xdata关键字的作用),可能初学C51时有点不好懂也不好记。没关系,我们马上就可以看到对应&*&前后不同的关键字的使用在编译时出现什么情况。
uchar xdata tmp[10]; //在外ram区开辟10个字节的内存空间,地址是外ram的0x9
第1种情况:
uchar data *
首先要提醒大家这样的代码是有bug的, 他不能通过这种方式正确的访问到tmp空间。 为什么?我们把编译后看到下面的汇编代码:
MOV 0x08,#tmp(0x00) ;0x08是指针pstr的存储地址
看到了吗!本来访问外ram需要2 byte来寻址64k空间,但因为使用data关键字(在&*&号前的那个),所以按KeilC编译环境来说就把他编译成指向内ram的指针变量了,这也是初学C51的朋友们不理解各个存储类型的关键字定义而造成的bug。特别是当工程中的默认的存储区类为large时,又把tmp[10] 声明为uchar tmp[10] 时,这样的bug是很隐秘的不容易被发现。
第2种情况:
uchar xdata *
这种情况是没问题的,这样的使用方法是指在内ram分配一个指针变量(&*&号后的data关键字的作用),而且这个指针本身指向xdata区(&*&前xdata关键字的作用)。编译后的汇编代码如下。
MOV 0x08,#tmp(0x00) ;0x08和0x09是在内ram区分配的pstr指针变量地址空间
MOV 0x09,#tmp(0x00)
这种情况应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了,请大家记住他。
第3种情况:
uchar xdata *
这中情况也是对的,但效率不如第2种情况。编译后的汇编代码如下。
MOV DPTR, #0x000A ;0x000A,0x000B是在外ram区分配的pstr指针变量地址空间
MOV A, #tmp(0x00)
MOV @DPTR, A
MOV A, #tmp(0x00)
MOVX @DPTR, A
这种方式一般用在内ram资源相对紧张而且对效率要求不高的项目中。
第4种情况:
uchar data *
如果详细看了第1种情况的读者发现这种写法和第1种很相似,是的,同第1 种情况一样这样也是有bug的,但是这次是把pstr分
配到了外ram区了。编译后的汇编代码如下。
MOV DPTR, #0x000A ;0x000A是在外ram区分配的pstr指针变量的地址空间
MOV A, #tmp(0x00)
MOVX @DPTR, A
第5种情况:
大家注意到&*&前的关键字声明没有了,是的这样会发生什么事呢?下面这么写呢!对了用齐豫的一首老歌名来说就是 &请跟我来&,请跟我来看看编译后的汇编代码,有人问这不是在讲C51吗? 为什么还要给我们看汇编代码。C51要想用好就要尽可能提升C51编译后的效率,看看编译后的汇编会帮助大家尽快成为生产高效C51代码的高手的。还是看代码吧!
MOV 0x08, #0X01 ;0x08-0x0A是在内ram区分配的pstr指针变量的地址空间
MOV 0x09, #tmp(0x00)
MOV 0x0A, #tmp(0x00)
注意:这是新介绍给大家的,大家会疑问为什么在前面的几种情况的pstr指针变量都用2 byte空间而到这里就用3 byte空间了呢?这是KeilC的一个系统内部处理,在KeilC中一个指针变量最多占用 3 byte空间,对于没有声明指针指向存储空间类型的指针,系统编译代码时都强制加载一个字节的指针类型分辩值。具体的对应关系可以参考KeilC的help中C51 User's Guide。
第6种情况:
这是最直接最简单的指针变量声明,但他的效率也最低。还是那句话,大家一起说好吗!编译后的汇编代码如下。
MOV DPTR, #0x000A ;0x000A-0x000C是在外ram区分配的pstr指针变量地址空间
MOV A, #0x01
MOV @DPTR, A
MOV DPTR, #0x000A
MOV A, #tmp(0x00)
MOV @DPTR, A
MOV A, #tmp(0x00)
MOVX @DPTR, A
这种情况很类似第5种和第3种情况的组合,既把pstr分配在外ram空间了又增加了指针类型的分辨值。
小结一下:大家看到了以上的6种情况,其中效率最高的是第2种情况,既可以正确访问ram区又节约了代码,效率最差的是第 6种,但不是说大家只使用第2种方式就可以了,还要因情况而定,一般说来应用51系列的系统架构的内部ram资源都很紧张,最好大家在定义函数内部或程序段内部的局部变量使用内ram,而尽量不要把全局变量声明为内ram区中。所以对于全局指针变量我建议使用第3 种情况,而对于局部的指针变量使用第2种方式。
keil C51存储区域分为程序存储区和数据存储区2大类型。
一.程序存储区(Pragram Area):
欲将声明的数据存放在程序存储区域,可以使用关键字&code&说明。
例 unsigned char code i=10;则表示 i为无符号字符型数据存放区域为程序存储区。
二.数据存储区(Data Memory):
数据存储区域分为内部数据存储区、外部数据存储区域和特殊功能寄存器寻址区。
1.内部数据存储区域(Internal Data Memory):可以使关键字&data、iadta、bdata&做相应说明。
data:直接寻址区,声明的数据存储范围为内部RAM低128字节 0X00~0X7F。
例 unsigned char data i=10;则表示 i为无符号字符型数据存放区域为数据存储区域(RAM)的低128字节范围内。
idata:间接寻址区,声明的数据存储范围为整个内部RAM区 0X00~0XFF。
例 unsigned char idata i=10;则表示 i为无符号字符型数据存放区域为数据存储区域(RAM)内。
bdata:可位寻址区,寻址范围为0X20~0X2F。
2.外部数据存储区(External Data Memory):可以使用关键字&pdata、xdata&进行说明。
pdata:主要用于紧凑模式,能访问1页(256字节)的外部RAM,即在访问使用,pdata定义的数据时,不会影响P2口的输出电平(在访问某些自身内部扩展的外部RAM时本身就不会影响I/O端口)。
例 u则表示 i为无符号字符型数据存放区域为外部数据存储区域(RAM)内(只能在一页范围内)具体操作哪一页,可由其他i/o口设定。
xdata:可访问64k的外部数据存储区,地址范围0X0000~0XFFFF,同pdata一样在访问芯片自身内部扩展的RAM时也不会影响I/O端口。
例 u则表示 i为无符号字符型数据存放区域为外部数据存储区(RAM)。
3.特殊功能寄存器寻址区域(Speciac Function Register Memory)-SFR:8051提供128字节的SFR寻址区,该区域可以字节寻址,字寻址,能被8整除的地址单元还可以位寻址。该区域用于控制定时器、计数器、串口等外围接口。使用时可用关键字&sfr、sfr16、sbit&做相应的声明。
例 字节寻址 sfr P0=0x80;为P0 口地址为80H,&=&后0X00~0XFF 之间的常数。
字寻址 sfr16 T2=0XCC;指定Timer2 口地址T2L=0XCC T2H=0XCD。
位寻址 sbit EA=0xAF;指定第0xAF 位为EA,即中断允许
在使用C51时有时我们并没有明确指定所定义的数据的存储类型,然而依然正确。 这是由于存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域。
供有3种存储模式(存储模式在 C51 编译器选项中选择):
1.Small模式
所有缺省变量参数均装入内部 RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。
2. Compact 模式
所有缺省变量均位于外部RAM区的一页(256Byte)。
3. Large 模式
所有缺省变量可放在多达 64KB 的外部RAM 区,优点是空间大,可存变量多,缺点是速度较慢。
C51存储器类型有bit sbit data xdata bdata pdata sfr code等,可能不全面有遗漏
对应的物理存储器是:
bit,即位数据:数据存储器位寻址区,即20H~2FH的范围,共16个字节,16*8=128个位,位地址00h~7fh,连续的。
sbit:特殊功能寄存器中的位数据:只有能够被8整除的那些特殊功能寄存器中的各个位才能被称为sbit,位地址80H~FFH,不连续的,间断的。
data:数据区,对51为00H~7FH共128个字节,对52为00H~FFH,共256个字节,用MOV寻址,前128用直接寻址或寄存器(R0~R7)寻址,后128用R0、R1间接寻址。
xdata:外部数据区,0000H~FFFFH连续,用DPTR间接寻址(MOVX指令)
bdata:位寻址去的字节,20H~2FH
sfr:特殊功能寄存器(80H~FFH),直接寻址
pdata:外部数据区,P2口保持数据,用R0R1间接寻址(MOVX指令)
code:程序存储器,用MOVC指令只读

我要回帖

更多关于 java unsigned char 的文章

 

随机推荐