由於 mcs51 的記憶體分成五大部份(註一),所以搞的 SDCC 的指標也要分成好幾種。以下先簡介指標定義準則:
type 變數型態 | located 指向位址 | pointer | physical 變數位址 | name |
unsigned char | xdata | * | data | p |
指標分類
- unsigned xdata char * data p;
指向外部記憶體的指標變數,變數存放在內部記憶體。
- unsigned char data * xdata p;
指向內部記憶體的指標變數,變數存放在外部記憶體。
- unsigned char code * xdata p;
指向程式記憶體的指標變數,變數存放在外部記憶體。 - unsigned char code * code p;
指向程式記憶體的指標變數,變數存放在程式記憶體,指標變數是唯讀,所以必須先設定初始值。 - unsigned char * xdata p;
指向任何記憶體的指標變數 (generic pointer),變數存放在外部記憶體。 - unsigned char * p;
指向任何記憶體的指標變數 (generic pointer),變數存放由 memory model 決定。 - char (* data fp)(void);
指向程式記憶體的函數指標變數,變數存放在內部記憶體。函數指標變數只能指向程式記憶體,無法修改喔。 - 由於內部記憶體指標讀取都是使用間接定址 (indirect addressing),所以無法存取 SFR 空間的記憶體內容。
指標變數大小
data | 1 |
xdata | 2 |
code | 2 |
generic pointer | 3 |
- generic pointer 是設計用來可以做通用指標變數使用,可以任意變換指標指向位址,但是相對的需要佔用 3 個 bytes 的位置,而且在做讀取寫入時,需要另外執行一個函數來轉換位址,沒事就少用一點吧。
張貼留言