首页 详解data,bdata,idata,pdata,xdata,code存储类型与存储区

详解data,bdata,idata,pdata,xdata,code存储类型与存储区

举报
开通vip

详解data,bdata,idata,pdata,xdata,code存储类型与存储区 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,bdata,idata,pdata,xdata,code存储类型与存储区
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 的 0x0000-0x0009 ...... 第 1种情况: uchar data * data pstr; pstr=tmp; 首先要提醒大家这样的代码是有 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; pstr = tmp; 这种情况是没问题的,这样的使用方法是指在内 ram分配一个指针变量("*"号后的data 关键字的作用),而且这个指针本身指向 xdata区("*"前 xdata关键字的作用)。编译后的汇编代码如下。 MOV 0x08,#tmp(0x00) ;0x08和 0x09是在内 ram区分配的 pstr指针变量 地址空间 MOV 0x09,#tmp(0x00) 这种情况应该是在这里所有介绍各种情况中效率最高的访问外 ram的方法了,请大家记 住他。 第 3种情况: uchar xdata * xdata pstr; pstr=tmp; 这中情况也是对的,但效率不如第 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; pstr=tmp; 如果详细看了第 1 种情况的读者发现这种写法和第 1 种很相似,是的,同第 1 种情况 一样这样也是有 bug的,但是这次是把 pstr分 配到了外 ram区了。编译后的汇编代码如下。 MOV DPTR, #0x000A ;0x000A是在外 ram区分配的 pstr指针变量的地址空 间 MOV A, #tmp(0x00) MOVX @DPTR, A 第 5种情况: uchar * data pstr; pstr=tmp; 大家注意到"*"前的关键字声明没有了,是的这样会发生什么事呢?下面这么写呢!对了 用齐豫的一首老歌名来说就是 “请跟我 来”,请跟我来看看编译后的汇编代码,有人问这不是在讲 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; pstr=tmp; 这是最直接最简单的指针变量声明,但他的效率也最低。还是那句话,大家一起说好吗! 编译后的汇编代码如下。 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系列的 系统 架构 酒店人事架构图下载公司架构图下载企业应用架构模式pdf监理组织架构图免费下载银行管理与it架构pdf 的内部 ram资源都很紧张,最好大家 在定义函数内部或程序段内部的局部变量使用内 ram,而尽量不要把全局变量声明为内 ram区中。所以对于全局指针变量我建议使用第 3 种情况,而对于局部的指针变量使用第 2种方式。  
本文档为【详解data,bdata,idata,pdata,xdata,code存储类型与存储区】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_136524
暂无简介~
格式:pdf
大小:82KB
软件:PDF阅读器
页数:4
分类:互联网
上传时间:2011-05-22
浏览量:79