在 GNU ARM 汇编 代码中标号(Label) 的格式如下:
1. 基本格式
1.1 标号定义语法
标号名:
指令或数据
示例:
_start: # 标号定义
mov r0, #1
bx lr
data_area: # 数据标号
.word 0x12345678
2. 标号命名规则
2.1 有效字符
- 以字母、下划线(
_)或点(.)开头 - 后续字符可以是:字母、数字、下划线、点
- 区分大小写(除非指定不区分)
2.2 命名示例
_start # 合法
.label1 # 合法
func_name # 合法
data_1 # 合法
.local_label # 局部标号常用
3. 局部标号(Local Labels)
GNU 汇编支持特殊的局部标号,使用数字形式:
3.1 局部标号格式
数字: # 前向引用
指令
指令
指令
数字: # 后向引用
指令
示例:
1: # 局部标号 1
mov r0, #1
b 2f # 前向跳转到局部标号 2
# 中间代码
2: # 局部标号 2
mov r0, #2
b 1b # 后向跳转到局部标号 1
3.2 局部标号引用
数字f:向前引用(forward)数字b:向后引用(backward) //backward [ˈbækwəd]
4. 特殊标号格式
4.1 标号后的指令格式
标号: 指令
示例:
loop: # 标号单独一行
cmp r0, #10
blt loop
add_one: add r0, r0, #1 # 标号和指令在同一行
4.2 数据标号
# 数据标号通常单独一行
data_start:
.word 1, 2, 3, 4
.ascii "String"
5. 标号作用域
5.1 全局标号
.global global_func # 声明为全局
global_func:
bx lr
5.2 局部标号
.local local_label # 声明为局部(可选)
local_label:
bx lr
6. 标号类型说明
6.1 代码标号
# 函数标号通常与 .type 配合
.global my_func
.type my_func, %function
my_func:
bx lr
6.2 数据标号
.global my_data
.type my_data, %object
my_data:
.word 0x1234
.size my_data, . - my_data
7. 完整示例
# GNU ARM 汇编标号完整示例
.section .text, "ax", %progbits
.align 2
# 程序入口(全局标号)
.global _start
.type _start, %function
_start:
# 使用局部标号
1:
mov r0, #0
b 2f # 前向跳转
# 更多代码
2: # 另一个局部标号
add r0, r0, #1
cmp r0, #10
blt 1b # 后向跳转
bx lr
# 数据段标号
.section .data, "aw", %progbits
.align 2
# 全局数据标号
.global buffer
buffer:
.space 256
.size buffer, 256
# 只读数据标号
.section .rodata, "a", %progbits
msg:
.asciz "Hello, ARM!"
.size msg, . - msg
8. 重要注意事项
- 标号定义必须在一行的开头(不能有前导空格)
- 标号后必须有冒号(
:) - 局部标号可重复使用,在同一个作用域内可以多次使用相同的数字
- 标号作用域通常从定义点开始,到下一个标号定义结束
- .type 指令用于指定标号类型(函数、对象等),有助于调试和链接
总结
GNU ARM 汇编中标号的基本格式是:标号名:
遵循标准的命名规则。支持局部标号(数字形式),可以方便地进行局部跳转。标号可以用于标记代码位置或数据位置,并通过 .global、.local、.type 等指令控制其可见性和类型。
