ARM伪指令AREA
用于定义一个代码段或数据段。其基本的语法格式如下:
AREA 段名 属性1,属性2, ...
其中:
段名
:是你为代码段或数据段指定的名称。如果段名以数字开头,则该段名需要用“│”括起来,如│1_test│。段名可以使用字母、小数点、竖线符号|、下划线_,等字符属性
:用来描述代码段或数据段的特性。多个属性之间用逗号分隔。
常用的属性包括:
CODE
:用于定义代码段,其默认属性为READONLY,该AREA区域中的代码或描述会被编译到FLASH中
。DATA
:用于定义数据段,其默认属性为READWRITE,一般该AREA区域中的代码或描述会被编译到RAM中
。READONLY
:指定本段为只读,常用于代码段,该属性值常和属性值CODE一起出现。READWRITE
:指定本段为可读可写,常用于数据段,该属性值常和属性值常和DATA一起出现。ALIGN
:用于指定对齐方式,其后面跟的是一个表达式,该表达式的取值范围通常为0~31,表示以2的表达式次方进行对齐。COMMON
:定义一个通用的段,它不包含任何的用户代码和数据。各源文件中同名的COMMON
段会共享同一段存储单元,这相当于静态引用。
以STM32的启动文件为例,里面有很多AREA指令
图1
图2
可以看到,按照ARM的规则,AREA指令后面紧跟段名,有些段名是保留的(编译器内置的),这些保留的段名有特殊意义,例如上图中出现的特殊段名有:STACK、HEAP、RESET,|.text|。
对于STACK段,编译器会把该区域的【汇编代码或描述】编译到栈区,也即内存的最高字节处。
对于RESET段,编译器会把该区域的【汇编代码或描述】编译到flash的起始地址处,对于ARM一般是0x8000000,如果你修改了。
注意上面【】中说的不是汇编代码,而是【汇编代码或描述】。例如RESET段就是一个典型的没有可执行代码的区域,里面只有【描述】,确切说就是里面只有DCD占位指令,利用这些DCD描述了中断向量表,也即中断和异常的函数指针,如上图1所示.
而在有些段中,里面都是些汇编代码,如上图2中的|.text|段中,里面是由PROC和ENDP指令包裹的汇编函数。