当前页面为 开发中 版本,查看特定版本的文档,请在页面左下角的下拉菜单中进行选择。

变量和常量数组

变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。

本编译器要求每次只能定义一个变量/常量数组。

从占用存储空间大小分类如下:

类型

存储大小

_Bool

1比特

char

1字节

short/int

2字节

long

4字节

从存储位置分类如下:

关键字

存储区域

__code

code

__xdata

xdata

data

注意

_Bool不能定义数组,且只能定义data变量。

也可以使用staticconstextern来修饰变量,其作用与标准C一样。

data区变量和数组

所有变量默认都为data区变量/数组。

1
2
3
4
5
6
_Bool a;
char c;
int b = 5;
long d = -8;
char str[] = "Hello world!";
int arr[5] = {1, 2, 3, 4, 5};

data区数组访问时,如果下标为变量,则编译器翻译为汇编后为访问IDAT(数据寄存器)和IADR(地址寄存器)两个寄存器来完成间接寻址访问。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void main()
{
    char a[] = {0, 1, 2, 3, 4, 5};
    uint8_t i = 3;
    char v0 = arr[i];   //mov A, #arr
                        //add A, i
                        //mov IADR, A
                        //mov A, IDAT
                        //mov v0, A

    a[i] = 123;         //mov A, #arr
                        //add A, i
                        //mov IADR, A
                        //mov A, #123
                        //mov IDAT, A

    a[2] = 7;           //mov A, #7
                        //mov arr + 2, A

    i = a[5];           //mov A, arr + 5
                        //mov i, A
    while(1){

    }
}

code区常量数组

使用__code关键字只能定义常量数组。

元素为单字节的__code数组会被编译器翻译为汇编跳转表形式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
                            //arr:
__code uint8_t arr[] = {    //add PCL, A
    0,                      //ret #0
    1,                      //ret #1
    2,                      //ret #2
    3,                      //ret #3
    4,                      //ret #4
    5                       //ret #5
};

void main(){
    uint8_t v = arr[2];     //mov A, #2
                            //call arr
                            //mov v, A
    ...
    while(1){

    }
}

注意

元素为单字节的__code数组长度不能超过256。

元素为多字节的__code数组直接存储到code区,访问时会被编译器翻译为movc指令。

xdata区变量和数组

PAN221x不支持xdata变量/数组。