差不多的。比如:
复制内容到剪贴板
代码:
typedef struct tag_data
{
int a;
int b;
int c;
} DATA;
#pragma udata big_data
DATA data[50];
#pragma udata
void main (void)
{
unsigned int i;
DATA * data_ptr;
data_ptr = &data[0];
for ( i = 0; i < 20; i ++)
{
data[i].a = 0x5555;
data[i].b = 0x6666;
data[i].c = 0x8888;
data_ptr[i].c = 0x9999;
}
data_ptr[30].a = 0xaaaa;
data_ptr[30] -> b = 0x9999;
while(1);
}
之所以强调用指针引用(包括显示引用和“隐式引用”--姑且这样称之,如上面“data
”)是告诉编译器用间址寻址(indirect addressing,即用FSR0)引用大数据对象而不用考虑跨区(bank)引用时BSR 的值。
可能是目前版本的C18 不够聪明,有时跨区访问时不知道及时更新BSR。这样用直接寻址时就会访问了错误的地址单元。另外,有时如果编译时已知道大数据对象的地址,编译器会生成更为简洁的汇编代码,如直接用MOVFF等。
[ 本帖最后由 Victor 于 2008-4-2 12:55 编辑 ]