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 一起使用吗?