GNU ARM 汇编中添加注释的方式如下:

基于 GNU 汇编器标准的注释格式

1. 行注释(单行注释)

1.1 使用 # 号(最常见)

# 这是单行注释
mov r0, #1     # 将立即数1加载到r0寄存器
add r1, r2, r3 # 计算r2+r3,结果存入r1

1.2 使用 @ 号(ARM 架构常见)

@ 这也是单行注释
mov r0, #1     @ 将立即数1加载到r0寄存器
@ 这是另一行注释

文档依据
虽然【链接内容】没有明确说明注释格式,但文档中提到:

“Note on targets where the @ character is the start of a comment (eg ARM) then another character is used instead.”

这表明在 ARM 目标上,@ 字符通常用于开始注释。

2. 块注释(多行注释)

2.1 使用 /* */(C 风格)

/*
  这是多行注释
  可以跨越多行
  常用于函数说明或代码块解释
*/
_start:
    mov r0, #0
    bx lr

3. 特殊注释语法

3.1 指令行内的注释

_start:            # 标号后可以加注释
    mov r0, #1     # 指令后加注释
    b .            # 无限循环

3.2 伪操作指令的注释

.section .text, "ax", %progbits  # 定义代码段
.global _start                   # 声明全局符号
.size func, .-func               # 计算函数大小

实际使用示例

@ ============================================
@ 文件名:startup.s
@ 功能:ARM Cortex-M 启动代码
@ 作者:xxx
@ 版本:1.0
@ ============================================

/*
 * 向量表定义
 * 包含处理器异常和中断处理程序地址
 */
.section .isr_vector, "a", %progbits
    .word _stack_top     /* 栈顶地址 */
    .word _reset_handler /* 复位向量 */
    .word nmi_handler    /* NMI 处理程序 */
    .word hardfault_handler /* 硬件错误处理程序 */

@ 代码段开始
.section .text, "ax", %progbits
.align 2

/*
 * 复位处理程序
 * 功能:系统初始化入口
 */
.global _reset_handler
.type _reset_handler, %function
_reset_handler:
    # 初始化栈指针
    ldr sp, =_stack_top

    # 清零 BSS 段
    ldr r0, =_sbss       @ BSS 段起始地址
    ldr r1, =_ebss       @ BSS 段结束地址
    mov r2, #0
1:                      # 局部标号1(循环开始)
    cmp r0, r1
    strlt r2, [r0], #4
    blt 1b              # 继续循环

    # 跳转到 C 语言的 main 函数
    bl main

    # 主函数返回后无限循环
    b .
.size _reset_handler, . - _reset_handler

@ 数据段
.section .data, "aw", %progbits
@ 初始化数据
initial_value: .word 0x12345678

@ 只读数据段
.section .rodata, "a", %progbits
hello_msg: .asciz "Hello, ARM!"  # 以零结尾的字符串

注释的最佳实践建议

1. 函数注释

/*
 * 函数:delay_ms
 * 参数:r0 - 延迟的毫秒数
 * 返回:无
 * 功能:软件延迟函数
 * 注意:基于 CPU 频率计算,不精确
 */
delay_ms:
    # 函数实现
    bx lr

2. 段描述注释

@ ================================
@ 中断服务例程
@ 这些函数必须快速执行
@ ================================
.section .text.fast_isr, "ax", %progbits

3. 重要算法注释

@ 快速乘法算法(使用移位和加法)
@ 公式:r0 = r1 * 3
add r0, r1, r1, lsl #1  @ r0 = r1 + (r1 << 1) = r1 * 3

需要注意的事项

  1. 注释符的位置#@ 之后到行尾的内容都会被当作注释
  2. 字符串内的特殊字符:在字符串中的 #@ 不会被当作注释开始
    .ascii "#comment"  # 这里的#是字符串的一部分,不是注释
  3. 预处理指令:某些预处理指令(如 .ifdef.macro)可能有特殊的注释要求
  4. 与指令冲突:避免在可能被误解为指令的地方使用注释
    # 错误示例
    mov r0, #1  # 这里的#1是指令的一部分,不是注释开始

总结

GNU ARM 汇编支持多种注释格式:

  1. 单行注释:使用 #@
  2. 多行注释:使用 /* */
  3. 注释可以出现在代码的任何位置,用于解释代码功能、记录修改历史、标记重要部分等

文档未详述注释的具体语法,但基于 GNU 汇编器的通用标准和 ARM 架构的常见实践,以上是标准的注释使用方法。在实际开发中,建议保持注释风格的一致性以提高代码可读性。