在 ARM 汇编中,AREA 伪操作用于定义一个代码段或数据段。
基本格式,英文描述:

AREA section_name{,attr1}{,attr2}{,attr3}...

基本格式,中文描述:

AREA 段名, 属性1, 属性2, 属性3, ...

注:

  • 段名
    1.段名 属于可选项;
    2.段名 可以用竖线 | 括起,也可以不用 |

主要属性

1. 段类型 属性

  • CODE - 代码段 默认为READONLY
  • DATA - 数据段 默认为READWRITE
  • READONLY - 只读(通常用于代码段)
  • READWRITE - 可读写(通常用于数据段)

简记:
一般看到 CODE 情况就是:

CODE, READONLY

一般看到 DATA 情况就是:

DATA, READWRITE

2. 对齐 属性

  • ALIGN=n - 按 2^n 字节对齐
    • ALIGN=2 表示 4 字节对齐(常用)
    • ALIGN=3 表示 8 字节对齐

在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐方式为2 表达式次方。

3. 其它 属性

  • NOINIT - 不初始化(用于 BSS 段)
  • INIT - 初始化
  • COMMON - 公共段(通用段)
    不包含任何的用户代码和数据。
    各源文件中同名的COMMON段共享同一段存储单元。
  • THUMB - Thumb 代码
  • ARM - ARM 代码(32位)

功能:

一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。

常用示例

代码段定义

AREA |.text|, CODE, READONLY, ALIGN=2
    ; 代码内容
    MOV R0, #0
    BX LR

数据段定义

; 只读数据
AREA |.rodata|, DATA, READONLY
my_const DCD 0x12345678

; 可读写数据
AREA |.data|, DATA, READWRITE
my_var DCD 0

BSS 段(未初始化数据)

AREA |.bss|, DATA, READWRITE, NOINIT
buffer SPACE 256  ; 保留 256 字节

完整示例

; 代码段
AREA RESET, CODE, READONLY
ENTRY
START
    LDR SP, =0x40001000
    BL main
    B .

; 子程序
AREA |.text|, CODE, READONLY, ALIGN=2
main
    MOV R0, #0x42
    BX LR

; 数据段
AREA |.data|, DATA, READWRITE
value DCD 0x1234

注意事项

  1. 段名通常用竖线 | 括起,但不是必须的 //★
  2. 代码段一般设置为 READONLY
  3. 多个 AREA 可以定义多个段
  4. 程序入口点用 ENTRY 标记
  5. 默认情况下,ARM 汇编器期望 4 字节对齐

这是 ARM 汇编(armasm)的标准格式,不同于 GNU 汇编器(gas)的语法。