由於 mcs51 的記憶體分成五大部份(註一),所以搞的 SDCC 的指標也要分成好幾種。以下先簡介指標定義準則:
located 指向位址 | type 變數型態 | pointer | physical 變數位址 | name |
__xdata | unsigned char | * | __data | p |
指標分類
- __xdata unsigned char * __data p;
指向外部記憶體的指標變數,變數存放在內部記憶體。
- __data unsigned char * __xdata p;
指向內部記憶體的指標變數,變數存放在外部記憶體。
- __code unsigned char * __xdata p;
指向程式記憶體的指標變數,變數存放在外部記憶體。 - __code unsigned char * __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 的位置,而且在做讀取寫入時,需要另外執行一個 __gptrget 或 __gptrput 來轉換位址,沒事就少用一點吧。
張貼留言