例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
注意事项
- 工具链特定:
C$$code是 ARM 自家工具链(ADS、ARMCC)的约定 - 向后兼容:现代 ARM 工具链(Arm Compiler 6)通常用更标准的
.text、.data - 链接脚本配合:这些段名需要与链接脚本中的段定义匹配
- 大小写敏感:ARM 汇编通常大小写不敏感,但段名要保持一致
这种命名方式主要用于早期的 ARM 开发工具,现代项目更常用 .text、.data 等标准名称。
