指針
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個週期 |