新闻中心

EEPW首页>嵌入式系统>设计应用> 51系列中data,idata,xdata,pdata的区别

51系列中data,idata,xdata,pdata的区别

作者: 时间:2016-11-27 来源:网络 收藏


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 Users 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空间了又增加了指针类型的分辨值。

本文引用地址://m.amcfsurvey.com/article/201611/322141.htm

上一页 1 2 下一页

评论


技术专区

关闭