C51中的指针与存储器特殊指针的差异

指针

C51编译器支持使用“*”号说明的指针。可以使用指针执行标准C中所有可执行的操作。但由于8051及其派生器件的独特结构,C51支持两种不同类型指针:存储器特殊指针和普通指针。

普通指针

普通指针的说明和标准C指针相同。例如:

char *s;        /* string prt */
int *numptr;    /* int ptr */
long *state;    /* long ptr */

普通指针总是使用三个字节进行保存。第一个字节用于存储器类型。第二个字节用于保存偏移量的高字节。第三个字节用于保存偏移量的低字节。普通指针可以访问8051存储空间任何位置的变量。因此许多库程序使用此类型的指针。使用这种普通隐式指针可以访问而不用考虑数在存储器中的位置。

存储器特殊指针

在指针的说明中,存储器特殊指针总是包含存储器类型的指定,并总是指向一个特定的存储器区域。例如:

char data *str;         /* ptr to string in data */
int xdata *numtab;      /* ptr to int(s) in xdata */
long code *powtab;      /* ptr to long(s) in code */

由于存储器类型在编译时指定,因此,无类型指针需要存储器类型字节,而已定义类型指针则不需要。已定义类型指针可用一个字节(idata,data,bdatapdata指针)或两个字节(codexdata指针)存储。

比较:存储器特殊&普通指针

用户可通过存储器特殊指针加速8051 C程序。下面的例子为几个不同指针说明中代码&数据规模和执行时间之间的差异。

描述idata指针xdata指针Generic 指针
示例程序char idata *ip;char xdata *xp;char *p;
-char val;char val;char val;
-val= *ip;val= *xp;val= *p;
所产生的8051程序代码MOV R0,ipMOV DPL,xp+1MOV R1,p+2
-MOV val,@R0MOV DPH,xpMOV R2,p+1
--MOV A,@DPTRMOV R3,p
--MOV val,ACALL CLDPTR
指针大小1字节数据2字节数据3字节数据
代码大小4字节代码9字节代码11字节代码+Lib
执行时间4个周期7个周期13个周期
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值