指针
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,bdata和pdata指针)或两个字节(code和xdata指针)存储。
比较:存储器特殊&普通指针
用户可通过存储器特殊指针加速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,ip | MOV DPL,xp+1 | MOV R1,p+2 |
- | MOV val,@R0 | MOV DPH,xp | MOV R2,p+1 |
- | - | MOV A,@DPTR | MOV R3,p |
- | - | MOV val,A | CALL CLDPTR |
指针大小 | 1字节数据 | 2字节数据 | 3字节数据 |
代码大小 | 4字节代码 | 9字节代码 | 11字节代码+Lib |
执行时间 | 4个周期 | 7个周期 | 13个周期 |