1.絕對宏
使用絕對宏時,需要添加投文件“absacc.h”,在該文件中定義的絕對宏有CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD。
CBYTE:對程序存儲區(code)的字節地址進行訪問。
例如:i=CBYTE[0X000F];表示i指向程序存儲區的地址爲0x000F的存儲單元,地址範圍爲0X0000~0XFFFF。
XBYTE:對擴展RAM區的字節地址進行訪問。
例如:i=XBYTE[0X000F];表示i指向擴展RAM區的地址爲0x000F的存儲單元,地址範圍爲0X0000~0XFFFF。
PBYTE:對擴展RAM區的字節地址進行訪問。
例如:i=PBYTE[0X000F];表示i指向擴展RAM區的地址爲0x000F的存儲單元,地址範圍僅爲一頁(256字節)。
DBYTE:對內部RAM區的字節地址進行訪問。
例如:i=PBYTE[0X000F];表示i指向內部RAM區的地址爲0x000F的存儲單元。
以WORD表示的是爲字操做,其餘的跟以上相同。
2.關鍵字“_at_”
使用關鍵字“_at_”不能對絕對變量進行初始化,位變量及函數不能用該關鍵字進行指定。使用方法爲直接在定義的數據後邊加上_at_,在加上要指向的絕對地址即可。
例如:unsigned char data i_at_0x0F;表示i指向內部RAM區域地址爲0x0f的單元;
unsigned char xdata i_at_0x0F;表示i指向擴展RAM區域地址爲0x0f的單元;
unsigned char xdata i[10] _at_0x0F;表示數組的起始地址爲擴展RAM區的0x0f單元。
3.鏈接定位控制
此法是利用連接控制指令 code xdata pdata \data bdata 對“段”地址進行。如要指定某具體變量地址,則在C模塊中聲明這些變量,並且使用BL51連接器/定位器的定位指令來指定絕對地址。
例如:要定義一個數組,需要把它定位到xdata區的地址2000h。首先在C模塊中聲明這個數組:
unsigned char xdata i[100];
Cx51編譯器爲該C模塊生成一個目標文件,並且包含了一放在xdata存儲區的變量段。因爲它在這個模塊中只有一個變量,那麼i[100];是這個段中僅有的變量,這個段名字爲?XD?模塊名“比如該模塊名爲mokuai.c,則這個段名字爲?XD?ALMCTRL。BL51連接器/定位器允許使用定位指令指定任意一個段的基地址。則可以通過以下指令指定變量的位置:BL51 … mokuai.obj XDATA(?XD?mokuai(2000h))。
此方法有一定的侷限性,使用相對較少