還是整個理解比較好,以下是51編譯用的幾個Memory block
記憶體種類
type | SDCC | instruction | size | addressing |
(A) program | __code | MOVC | 64K | index direct |
(B) external | __xdata | MOVX | 64K | indirect |
(C) internal(80~FF) | __idata | MOV | 128 | indirect |
(C) SFR(80~FF) | __sfr | MOV | 128 | direct |
(C) internal(0~7F) | __data | MOV | 128 | direct/indirect |
記憶體定址
type | read | write | register |
direct | MOV Rn,direct MOV direct,direct | MOV direct,Rn MOV direct,@DPTR MOV direct,#data | R0~R7,A |
indirect | MOV direct,@Ri MOVX A,@DPTR | MOV @Ri,direct MOVX @DPTR,A MOV @Ri,#data | R0,R1,DPTR,A |
index direct | MOV A,#30h MOV DPTR,#300H MOVC A,@A+DPTR | X | A,DPTR |
- Ri=R0,R1,Rn=R0~R7。
- 索引定址法 (index direct) 只能用在程式記憶體,而且不能寫入,只能讀取到 A。
- 外部記憶體只能使用間接定址法 (indirect),而且只能透過 Ri/DPTR/A 三者傳遞數值,如果要寫入數值,只能把值先存入 A,再由 A 寫入 DPTR/Ri。
- 內部記憶體不論間接或直接都可以直接把數值寫入,不需要透過 A,當然要經由 A 也是可以。
如果ASM Code還太難先不用看,不過要理解間接定址跟直接定址差異,接著講各變數宣告方法和差異,SDCC指編譯器type
變數型態
| located 指向位址 | pointer | physical 變數位址 | name |
unsigned char | xdata | * | data | p |
這裡我們用Pointer當範例,因為c語言中Pointer最重要,也最易搞混
指標分類
- 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 |
所以看完以上的宣告關係,您可以知道差異在哪,以下是問題了
1. 沒錯,變數存放在xdata
2. 一樣唷,之前解答有很詳細的說明//www.icxbk.com/ask/detail?tid=2243,定義在h標頭檔,其中一個c檔案明確定義,則其他c檔案就可以引用,會指向同一個變數a
3. 可參考上面講解的內部資料記憶體(xdata)和外部資料記憶體(data),定址方式和ASM Code差異,C語言上看不出來,但ASM Code的指令集會不一樣(MOVX/MOV)
4.
int a; //會存放在內部資料記憶體,即data
extern int a;//extern宣告需上下對應
5.
看看您宣告哪些變數,像sbit/bit這些小於1byte的會變成小數,在xdata的size會增加,Program size: data= , xdata=, code= 分別代表三個區塊記憶體占用大小(byte為單位)
以上應該很清楚的整個脈絡,加油