6.5.7 绝对地址访问函数库

绝对地址访问函数库提供了一些宏定义的函数,用于对存储空间的访问。绝对地址访问库的函数包含在头文件ABSACC.H中,各个函数如表6.12所示。下面分别介绍各个函数。

1.BYTE型存储空间访问函数CBYTE、DBYTE、PBYTE和XBYTE

BYTE型存储空间访问函数CBYTE、DBYTE、PBYTE和XBYT的宏定义原型如下。


define CBYTE((unsigned char volatile code*)0)

define DBYTE((unsigned char volatile idata*)0)

define PBYTE((unsigned char volatile pdata*)0)

define XBYTE((unsigned char volatile xdata*)0)


6.5.7 绝对地址访问函数库 - 图1

BYTE型存储空间访问函数用于对8051单片机的存储空间进行绝对地址访问,可以进行字节寻址。其中,CBYTE用来寻址CODE区,DBYTE用来寻址IDATA区,PBYTE用来寻址PDATA区(可采用MOVX@R0指令),XBYTE用来寻址XDATA区(可采用MOVX@DPTR指令),程序示例如下。


include<ABSACC.H>//头文件

include<stdio.h>

include<reg51.h>

void main(void)//主函数

{

char ch;//声明变量

DBYTE[0x0040]=0x41;//对IDATA区赋值

PBYTE[0x0002]=0x42;//对PDATA区赋值

XBYTE[0x0002]=0x43;//对XDATA区赋值

ch=CBYTE[0x0002];//读取CODE区

printf(“ch=%bx\n”,ch);

ch=DBYTE[0x0040];//读取IDATA区

printf(“ch=%bx\n”,ch);

ch=PBYTE[0x0002];//读取PDATA区

printf(“ch=%bx\n”,ch);

ch=XBYTE[0x0002];//读取XDATA区

printf(“ch=%bx\n”,ch);

}


该程序可以在KeilµVision3编译环境中执行,运行的结果如下。


ch=5c

ch=41

ch=42

ch=43


在该程序中,首先声明并初始化位变量,接着对IDATA、PDATA和XDATA区赋值,最后分别读取CODE、IDATA、PDATA和XDATA区,并打印输出结果。

2.WORD型存储空间访问函数CWORD、DWORD、PWORD和XWORD

WORD型存储空间访问函数CWORD、DWORD、PWORD和XWORD的宏定义原型如下。


define CWORD((unsigned int volatile code*)0)

define DWORD((unsigned int volatile idata*)0)

define PWORD((unsigned int volatile pdata*)0)

define XWORD((unsigned int volatile xdata*)0)


WORD型存储空间访问函数可以访问8051的所有存储器空间,其功能与上一个宏相似,只是其定义的数据类型为unsigned int。使用该宏时,实际存储器地址应为2*sizeof(unsigned int),程序示例如下。


include<ABSACC.H>//头文件

include<stdio.h>

include<reg51.h>

void main(void)//主函数

{

int chl;//声明变量

DWORD[0x0040]=0x41;//对IDATA区赋值

PWORD[0x0002]=0x42;//对PDATA区赋值

XWORD[0x0002]=0x43;//对XDATA区赋值

chl=CWORD[0x0002];//读取CODE区

printf(“chl=%d\n”,chl);

chl=DWORD[0x0040];//读取IDATA区

printf(“chl=%d\n”,chl);

chl=PWORD[0x0002];//读取PDATA区

printf(“chl=%d\n”,chl);

chl=XWORD[0x0002];//读取XDATA区

printf(“chl=%d\n”,chl);

}


该程序可以在KeilµVision3编译环境中执行,运行的结果如下。


chl=5924

chl=65

chl=66

chl=67


在该程序中,首先声明并初始化位变量,接着对IDATA、PDATA和XDATA区赋值,然后分别读取CODE、IDATA、PDATA和XDATA区的数据并打印输出结果。

3.far存储区访问函数FVAR和FCVAR

far存储区访问函数FVAR和FCVAR的宏定义原型如下。


define FVAR(object,addr)(((object volatile far)((addr)+0x10000L)))

define FCVAR(object,addr)(((object const far)((addr)+0x810000L)))


far存储区访问函数用于访问far存储器区域。其中,FVAR用于访问far空间(存储类为HDATA),FCVAR用于访问const far空间(存储类为HCONST)。在访问时,绝对地址目标不能超过64KB的段边界,例如不能在地址0xFFEE访问一个long变量。程序示例如下。


include<ABSACC.H>//头文件

define IOVAL FVAR(long,0x04FFE)//访问HDATA存储空间的地址0x04FFE

void main(void)//主函数

{

int var;

var=IOVAL;//读

IOVAL=0x10;//写

var=FCVAR(int,0x12002);//从HCONST存储空间读地址0x24002

}


该程序可以在KeilµVision3编译环境中执行。程序中使用FVAR宏定义了IOVAL,接着在主函数中使用IOVAL来进行读写HDATA存储空间的地址0x04FFE。最后,通过FCVAR从HCONST存储空间读地址0x12002。

4.far存储区数组访问函数FARRAY和FCARRAY

far存储区数组访问函数FARRAY和FCARRAY的宏定义原型如下。


define FARRAY(object,base)(((object volatile far)((base)+0x10000L)))

define FCARRAY(object,base)(((object const far)((base)+0x810000L)))


far存储区数组访问函数用于访问far存储器区域的数组类型目标。其中,FARRAY用于访问far空间(存储类为HDATA),FCARRAY用于访问const far空间(存储类为HCONST)。绝对地址目标不能超过64KB的段边界,例如不能在起始地址为0xFFF9访问一个有20个元素的long数组。程序示例如下。


include<ABSACC.H>//头文件

define DPortRam FARRAY(int,0x24000)

void main(void)//主函数

{

int i;//声明变量

long l;

l=FARRAY(long,0x8000)[i];//使用FARRAY访问

FARRAY(long,0x8000)[10]=0x12345678;

DPortRam[i]=0x1234;

l=FCARRAY(long,0x81000)[5];//使用FCARRAY访问

}


该程序可以在KeilµVision3编译环境中执行。程序中分别使用FARRAY和FCRRAY函数读写存储区。