绝对地址的访问方法

来源:互联网 发布:淘宝客服用语大全 编辑:程序博客网 时间:2024/06/10 09:40
C51提供了3种访问绝对地址的方法,分别问:绝对宏、关键字“_at_”、连接定位控制。

   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))。

    此方法有一定的局限性,使用相对较少

0 0