【问题标题】:How to make the GNU Assembler use a slash / for comments?如何让 GNU 汇编器使用斜杠 / 表示注释?
【发布时间】:2013-03-17 19:05:36
【问题描述】:

这确实是我的一个愚蠢的特质,但我无法忍受 GNU AS 用来插入评论的方式。我太习惯 Sun 方式(大多数 UNIX 汇编器中使用的方式相同),它使用简单的斜杠“/”将代码注释掉,直到行尾。

你知道一种方法来完成我的小奇思妙想吗?

【问题讨论】:

  • 一些正则表达式(Vim、Perl、sed...)可能会很容易做到。您可以在Makefile 中添加适当的正则表达式命令来预处理您的源代码,从而将您选择的注释语法转换为适用于 GNU AS 的注释语法。
  • 我的as (2.20.1, x86_64-linux-gnu) 版本接受///# 作为评论起始者。
  • @Michael:你看,/ 只有在它是一行中的第一个字符时才能在as 中工作。您不能将其放在指令之后,以注释掉该行的其余部分。
  • 好的。所以你必须使用#。如果您在阅读代码时发现那些分散注意力的内容,您可以按照 nrz 的建议进行操作。
  • gnu 以破坏健全的汇编语言语法概念而自豪。

标签: assembly comments gnu gnu-assembler


【解决方案1】:

在 Gnu 汇编器中,注释开始字符是特定于目标的。对于 i386 和 x86_64,它是 #。对于 ARMv7,它是 @。

其他一些注释约定在某些条件下有效。我不确定细节。 // comment starter 和 /* */ 多行 cmets 是我见过的例子。

【讨论】:

  • 谢谢。我随机尝试了#,但当我尝试在非空行末尾添加注释时显然出错了。现在我到处都在使用@。
  • 这不严重。它的 ;在 AVR 上
  • 我没有找到任何使用/* */ 的arch(当然C 预处理器本身除外)。你有例子吗?
【解决方案2】:

是的,继续使用#,你会习惯的。

可能有一些方法可以让/ 工作,但是您的代码不仅是特定于处理器的,而且是特定于计算机的。你最好习惯小事,而不是完全破坏代码的可移植性来幻想一时兴起。

【讨论】:

    【解决方案3】:

    GNU GAS 文档

    在“Machine Dependencies”部分下,进入每个拱门,然后进入“语法”和“字符”。

    这记录了每个拱门的 cmets 是什么。

    x86

    https://sourceware.org/binutils/docs-2.26/as/i386_002dChars.html#i386_002dChars

    在一行的任何地方出现“#”表示注释的开始,一直延伸到该行的末尾。

    如果“#”作为一行的第一个字符出现,则整行被视为注释,但在这种情况下,该行也可以是逻辑行号指令(参见注释)或预处理器控制命令(见预处理)。

    如果没有指定 --divide 命令行选项,那么出现在行中任意位置的“/”字符也会引入行注释。

    但是,我要么遗漏了某些东西,要么存在错误,因为我的测试与文档不匹配。

    好的:

    / mycomment
    # mycomment
    nop # mycomment
    

    失败:

    nop / mycomment
    

    这表明/ 仅在它是第一个字符时才有效。

    --divide 没有任何区别。

    手臂

    https://sourceware.org/binutils/docs-2.26/as/ARM_002dInstruction_002dSet.html#ARM_002dInstruction_002dSet

    在一行的任何地方出现“@”表示注释的开头延伸到该行的末尾。

    如果“#”作为行的第一个字符出现,则整行被视为注释,但在这种情况下,该行也可以是逻辑行号指令(参见注释)或预处理器控制命令(见预处理)。

    我对@9​​87654330@ 的测试证实了文档所说的内容。

    好的:

    # mycomment
    @ mycomment
    nop @ mycomment
    

    失败:

    nop # mycomment
    

    aarch64

    https://sourceware.org/binutils/docs-2.26/as/AArch64_002dChars.html#AArch64_002dChars

    在一行中出现'//' 表示注释的开头延伸到当前行的结尾。如果“#”作为一行的第一个字符出现,则整行都被视为注释。

    此外,ARMv8-fb manual 在 C1.2 “A64 汇编语言的结构”本身也鼓励了这一点:

    在 C1-185 页的示例 C1-1 中,序列 // 用作注释前导符,鼓励 A64 汇编器接受此语法。

    我对@9​​87654333@ 的测试证实了文档所说的内容。

    好的:

    // mycomment
    # mycomment
    nop // mycomment
    

    失败:

    nop # mycomment
    

    个人推荐

    如果可以选择,始终使用 gcc 编译程序集或显式使用 C 预处理器 cpp,并使用 C 预处理器 cmets:

    /* mycomment */
    

    因为:

    • C 是标准化的,适用于所有拱门
    • 无论如何你都需要 C 预处理器,因为 GNU GAS 宏不够强大
    • # 不好,因为它可能与 # 预处理器指令冲突

    在 Ubuntu 16.04、Binutils 2.26.1 上测试。

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 2015-07-28
      • 2011-10-26
      • 2019-05-12
      • 2015-11-02
      • 2023-02-17
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多