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,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個週期
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章