x86 AT&T 语法程序集的注释语法

Posted

技术标签:

【中文标题】x86 AT&T 语法程序集的注释语法【英文标题】:Commenting syntax for x86 AT&T syntax assembly 【发布时间】:2013-06-30 19:34:32 【问题描述】:

Intel 语法中的 cmets 使用分号。当我切换到 AT&T 时,它实际上试图解释 cmets。

AT&T 程序集的注释语法是什么?

【问题讨论】:

GAS .intel_syntax noprefix 使用 # 作为注释字符。您可能在谈论其他类型的 Intel 语法,例如 NASM 或 MASM。 【参考方案1】:

at&t 汇编器的注释是:

 # this is a comment
 /* this is a comment */

根据the fourth result Google gave me

///* */ cmets 仅在 .S 文件中受支持,因为 GCC 在汇编之前对它们运行 C 预处理器。对于 .s 文件,实际的汇编程序本身 (as) 仅将 # 作为注释字符处理,对于 x86。

对于其他一些 ISA,GAS 使用其他注释字符,例如 ARM 的 @

【讨论】:

谢谢!奇怪的是,GNU Emacs 不支持语法着色中的十六进制 cmets。【参考方案2】:

GNU AS 评论

以下由as直接处理。 (不是 C 预处理器。)

# 评论 - 用作“其余行”评论。

重要警告:# 也是 GCC 预处理器指令符号。预处理器首先运行,因此这意味着如果您正在运行它,

# include comments in your code to get full credit

在行首(空格不算)会给你error: #include expects "FILENAME" or <FILENAME>和gcc,即使#后面有一个空格。

但是,这些是区分大小写的,所以大写 # Include 实际上有效:

# Include comments in your code to get full credit

尽管将 cmets 的第一个字母大写通常是一种很好的做法,但您可以使用 ## 作为以防万一的措施。 (只是不要在属于#define 宏的任何行上使用它,因为## 也是令牌粘贴运算符。)

/ cmets - 行首注释

这些只能用在行首(删除空格之后)。

/ This is OK
xor %eax, %eax / This is *not* ok

C 风格的注释(预处理器)

如果 C 预处理器在源文件上运行,则这些工作正常。

在大多数架构中,支持以下内容:

// Rest of line comment 的工作方式与您对 C 的期望一样。

在极少数情况下,这会导致 . 伪操作出现问题。为了解决这个问题,我只需使用块注释或将注释移到前一行。

/* Use this for block comments */。我目前没有遇到任何问题。

那我用什么?

如果您不允许对所有内容进行预处理,请选择一种 GNU AS 注释样式,#/。 如果您确定预处理所有内容,则使用 C 风格的 cmets ///**/ 可能会更安全,以避免出现预处理器问题。但是,如果您牢记隐藏的陷阱,应该没问题。 如果您担心必须同时处理这两种情况,请选择/##,这样您就不必担心预处理器或任何文件缺少预处理器。 ## 更通用,但可能导致代码更混乱。 无论哪种情况,选择一种并保持一致。

【讨论】:

您没有来预处理 AT&T 语法文件。 gcc 在编译 .S 文件时执行,但不是 .s。不过,编写无论有无 CPP 都可以安全使用的 cmets 是个好主意。【参考方案3】:

尝试 # 或 // 或 /* */。可能会工作

【讨论】:

以上是关于x86 AT&T 语法程序集的注释语法的主要内容,如果未能解决你的问题,请参考以下文章

AT&T 语法中的 3 或 4 参数 x86 程序集[重复]

我可以将 x86 程序集的 Intel 语法与 GCC 一起使用吗?

x86 程序集:“subl”命令如何在 AT&T 语法中工作

反向数组 X86 AT&T 语法

AT&T汇编语法与x86语法基本区别

使用 AT&T 语法时汇编程序崩溃 [重复]