在 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. 重要注意事项

  1. 标号定义必须在一行的开头(不能有前导空格)
  2. 标号后必须有冒号:
  3. 局部标号可重复使用,在同一个作用域内可以多次使用相同的数字
  4. 标号作用域通常从定义点开始,到下一个标号定义结束
  5. .type 指令用于指定标号类型(函数、对象等),有助于调试和链接

总结

GNU ARM 汇编中标号的基本格式是:
标号名:

遵循标准的命名规则。支持局部标号(数字形式),可以方便地进行局部跳转。标号可以用于标记代码位置或数据位置,并通过 .global.local.type 等指令控制其可见性和类型。