变量和常量数组¶
变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
本编译器要求每次只能定义一个变量/常量数组。
从占用存储空间大小分类如下:
类型 |
存储大小 |
---|---|
|
1比特 |
|
1字节 |
|
2字节 |
|
4字节 |
从存储位置分类如下:
关键字 |
存储区域 |
---|---|
|
code |
|
xdata |
无 |
data |
注意
_Bool不能定义数组,且只能定义data变量。
也可以使用static
,const
和extern
来修饰变量,其作用与标准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变量/数组。