在程序中,用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括: CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 例如: rval=CBYTE[0x0002];指向程序存贮器的0002h地址 rval=XWORD [0x0002];指向外RAM的0004h地址
keil里
/*--------------------------------------------------------------------------
ABSACC.H
Direct access to 8051, extended 8051 and Philips 80C51MX memory areas.
Copyright (c)1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
Allrights reserved.
--------------------------------------------------------------------------*/
#ifndef__ABSACC_H__
#define__ABSACC_H__
#define CBYTE((unsigned char volatile code *) 0)
#define DBYTE((unsigned char volatile data *) 0)
#define PBYTE((unsigned char volatile pdata *) 0) /**/
#define XBYTE((unsigned char volatile xdata *) 0) /*外部RAM*/
#define CWORD((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#definePWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)
#ifdef __CX51__
#define FVAR(object, addr) (*((object volatile far *) (addr)))
#define FARRAY(object, base) ((object volatile far *) (base))
#define FCVAR(object, addr) (*((object const far *) (addr)))
#defineFCARRAY(object, base) ((object const far *) (base))
#else
#define FVAR(object,addr) (*((object volatile far *) ((addr)+0x10000L)))
#defineFCVAR(object, addr) (*((object const far *) ((addr)+0x810000L)))
#defineFARRAY(object, base) ((object volatile far *) ((base)+0x10000L))
#defineFCARRAY(object, base) ((object const far *) ((base)+0x810000L))
#endif
#endif
其他的你到编译器预定义头文件里找好了/**********************************CBYTE********************************/
Q:
absacc.h里的宏
#define CBYTE((unsigned char volatile code *) 0)
value =CBYTE[0x002];
这句该如何理解?A1:
结果是将程序空间(code)地址为0x002单元的内容放到变量value中。
A2:
替换一下考虑
value = ((unsigned char volatile *) 0)[0x02];
替换一下考虑
unsigned char volatile *CBYTE = 0/*NULL*/;
这里CBYTE[0x02] = 1和*(CBYTE+0x02) = 1等价
#define CBYTE ((unsigned char volatile code *) 0)
是把CBYTE是指针,即code地址0在这里,数组和指针是可以互用的。CBYTE[0x02]也就是*(CBYTE+0x02),都是指的是地址0x02里的内容,并是unsigned char 类型的。#define CBYTE ((unsigned char volatile code *) 0)
考虑下这个define定义的内容
1、把CBYTE定义成一个0(0);
2、这个0是个地址(*号);
3、这个地址是代码段的地址(code);
4、并是unsigned char类型的地址(unsigned char);
5、并这个地址的内容是易逝性的(volatile);
本质上是定义了一个地址(CBYTE )。指针就是地址。地址是内存的序号。
指针通过指向内存的序号访问内存。替换点是都是地址。内部的括号用来强制类型转换用的,外部的的括号用来防止宏定义展开时错误的用法
/*************************************************************************************/
联系客服