Keil中C语言写入地址数据出错

尝试练习了几个题目,其中有一个是将一个数组内的的正负数以及0的个数统计写入固定地址

#include
#include
data unsigned int y1 _at_ 0x60;
#define y3 DBYTE [0x30]
#define y4 DBYTE [0x31]
#define y5 DBYTE [0x32]
void main()
{
    unsigned int i,a1,b;
    char j=0;
    char c;
    int data x=0,y=0,z=0;
    unsigned int *y2=0x50;
    int a[]={-50,-36,0,1,-128,0,127,89,-89,40};  //正负数数量
    int data tab[]={-50,-36,0,1,-128,99,127,89,-89,40};  //对应的从小到大的十六进制为
    char edg[]={34,56,89,123,90,23,12,22,77,10}; //求和
    for(i=0;i<10;i++)
    {
        if(a[i]>0)
        y3 = y3+1;
        if(a[i]<0)
        y4 = y4+1;
        if(a[i]==0)
        y5 = y5+1;
    }

在一开始定义0x30地址的时候,有尝试过

data unsigned int y[3] _at_ 0x30;

但是会报错
*** ERROR L107: ADDRESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: DATA_GROUP
LENGTH: 003DH
直接用宏定义的话,到后面在第一个for循环开始之前,0x30地址位就会莫名其妙多出来数据
想问一下是什么问题

是用这种方法吗,一般都是用 attribute 的,我使用好像没出现过你说的情况。是不是哪个地方对这个地址有操作了?

ADDRESS SPACE OVERFLOW
这个错误不是你代码里有错误,是指资源不够了,要用到的data已经超过你单片的ram了
非增强51机就128字节ram你这超了

直接用宏定义的话,到后面在第一个for循环开始之前,0x30地址位就会莫名其妙多出来数据

这是因为你没初始化,开始时这几个地址你没清零