如何让GNU汇编程序使用斜杠/注释?

mgh*_*his 10 assembly comments gnu gnu-assembler

这确实是我的一个愚蠢的特质,但我不能忍受GNU AS用来插入评论的方式.我太熟悉Sun方式(在大多数UNIX汇编程序中使用的方法),它使用简单的斜杠"/"来注释掉代码直到行尾.

你知道如何实现我的小心血来潮吗?

Uwe*_*der 19

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

其他一些评论惯例在某些条件下有效.我不确定细节.//评论启动器和/**/多行注释是我见过的例子.

  • `@`对于ARM确实如此 (3认同)

Vel*_*tas 12

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

可能有一些方法可以/开始工作,但是你的代码不仅仅是特定于处理器的,而是特定于计算机的.你最好习惯于小事,而不是完全破坏你的代码的可移植性来随心所欲.


Cir*_*四事件 6

GNU GAS 文档

在“ Machine Dependencies ”部分下,进入每个arch,然后进入“Syntax”和“Chars”。

这记录了每个拱门的评论。

x86

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

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

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

如果未指定 --divide 命令行选项,则出现在行上任何位置的“/”字符也会引入行注释。

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

好的:

/ mycomment
# mycomment
nop # mycomment
Run Code Online (Sandbox Code Playgroud)

失败:

nop / mycomment
Run Code Online (Sandbox Code Playgroud)

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

--divide没有任何区别。

手臂

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

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

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

我的测试arm-linux-gnuabihf-as确认了文档所说的内容。

好的:

# mycomment
@ mycomment
nop @ mycomment
Run Code Online (Sandbox Code Playgroud)

失败:

nop # mycomment
Run Code Online (Sandbox Code Playgroud)

aarch64

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

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

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

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

我的测试aarch64-linux-gnuabihf-as确认了文档所说的内容。

好的:

// mycomment
# mycomment
nop // mycomment
Run Code Online (Sandbox Code Playgroud)

失败:

nop # mycomment
Run Code Online (Sandbox Code Playgroud)

个人推荐

如果可以选择,只需始终使用gcccpp显式使用 C 预处理器编译程序集,并使用 C 预处理器注释:

/* mycomment */
Run Code Online (Sandbox Code Playgroud)

因为:

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

在 Ubuntu 16.04、Binutils 2.26.1 上测试。