例1

AREA |C$$code|, CODE, READONLY

分解解释

1. |C$$code|

  • | 竖线:可选的分隔符,用于包含特殊字符
  • C$$code:ARM 工具链的特殊段名
    • C$$ 前缀:表示这是 C 编译器相关的段
    • code:表示这是代码段
  • 这是 ARM 编译器的内部约定命名,通常由编译器自动生成

2. 完整含义

AREA |C$$code|, CODE, READONLY

翻译为:

  • 定义一个名为 C$$code 的段
  • 类型是 代码段CODE
  • 属性是 只读READONLY

实际应用场景

场景1:C 编译器生成的启动代码

; ARM 编译器(ARMCC/ADS)可能生成的代码
AREA |C$$code|, CODE, READONLY
    IMPORT __main         ; 导入 C 主函数
    EXPORT __start

__start
    LDR SP, =0x40010000   ; 设置栈指针
    BL __main             ; 跳转到 C 的 main()
    B .                   ; 无限循环

场景2:C 和汇编混合编程

// C 代码
extern void asm_func(void);

int main() {
    asm_func();
    return 0;
}
; 汇编代码
AREA |C$$code|, CODE, READONLY
    EXPORT asm_func

asm_func
    MOV R0, #0x42
    BX LR

类似的特殊段名

ARM 工具链还有其他类似的命名:

段名 含义 用途
|C$$code| C 代码段 存放 C 编译的代码
|.text| 通用代码段 GNU 风格
|C$$data| C 数据段 初始化的 C 全局变量
|C$$bss| BSS 段 未初始化的 C 变量
|.constdata| 常量数据 只读数据

GNU 汇编的等价写法

; GNU 汇编(更常见)
.section .text, "ax", %progbits
# 或
.text

完整示例

; ARM 工具链风格的程序
    AREA |C$$code|, CODE, READONLY
    ENTRY

Reset_Handler
    ; 设置栈指针
    LDR SP, =_stack_top

    ; 初始化 BSS 段
    LDR R0, =__bss_start__
    LDR R1, =__bss_end__
    MOV R2, #0
clear_bss
    CMP R0, R1
    STRLO R2, [R0], #4
    BLO clear_bss

    ; 跳转到 C 的 main
    BL main

    ; 主程序返回后的处理
    B .

; 另一个代码段
    AREA |.text|, CODE, READONLY
asm_function
    ; 汇编函数
    BX LR

; 数据段
    AREA |C$$data|, DATA, READWRITE
global_var
    DCD 0x00000000

注意事项

  1. 工具链特定C$$code 是 ARM 自家工具链(ADS、ARMCC)的约定
  2. 向后兼容:现代 ARM 工具链(Arm Compiler 6)通常用更标准的 .text.data
  3. 链接脚本配合:这些段名需要与链接脚本中的段定义匹配
  4. 大小写敏感:ARM 汇编通常大小写不敏感,但段名要保持一致

这种命名方式主要用于早期的 ARM 开发工具,现代项目更常用 .text.data 等标准名称。