如何在 Intel 语法中使用 clang 生成汇编代码?

Posted

技术标签:

【中文标题】如何在 Intel 语法中使用 clang 生成汇编代码?【英文标题】:How to generate assembly code with clang in Intel syntax? 【发布时间】:2012-06-14 22:38:20 【问题描述】:

正如this question 所示,使用g++,我可以做到g++ -S -masm=intel test.cpp。 另外,使用 clang,我可以做到 clang++ -S test.cpp,但 clang (warning argument unused during compilation: -masm=intel) 不支持 -masm=intel。如何使用 clang 获取 intel 语法?

【问题讨论】:

@JerryCoffin:谢谢,我使用 clang 生成了一个 .bc 文件,然后成功输出了带有 llc 的 Intel 程序集。介意这样回答吗? 哦,我想这不是问题。 【参考方案1】:

作为 noted below by @thakis,较新版本的 Clang (3.5+) 接受 -masm=intel 参数。


对于旧版本,这应该会发出带有 Intel 语法的汇编代码:

clang++ -S -mllvm --x86-asm-syntax=intel test.cpp

您可以使用-mllvm <arg> 从 clang 命令行传入 llvm 选项。遗憾的是,这个选项似乎没有很好的文档记录,因此我只能通过浏览 llvm 邮件列表找到它。

【讨论】:

llvm.org/bugs/show_bug.cgi?id=17465 请求支持 -masm=intel 及更高版本。 @dcoles 不适用于 clang 3.7。我执行了$clang -S -mllvm --x86-asm-syntax=intel file.c。我在这里做错了什么吗?它没有给出任何错误并静默退出。 @saumya-suhagiya 我刚刚确认这仍然适用于 clang 3.8.0-svn244195-1~exp1。上面显示的命令将生成一个名为test.s 的文件。您可以使用 -o <path> 选项将此输出位置更改为自定义位置。 @dcoles 嗨,也许是一个不太聪明的问题。是否可以用nasm编译和链接汇编代码? @AlexanderCska 我不确定如果没有一些手动修复这是否可行。虽然 NASM 的语法与 Intel 的相似,但它们之间存在一些不兼容。【参考方案2】:

截至clang r208683(clang 3.5+),它理解-masm=intel。因此,如果您的 clang 足够新,您可以使用它。

【讨论】:

在我看来-masm=intel生成的代码不能再被clang编译?我正在运行 clang 3.8。【参考方案3】:

假设您可以让 Clang 发出正常的 LLVM 字节码,然后您可以使用 llc 编译为汇编语言,并使用其 --x86-asm-syntax=intel 选项以 Intel 语法获得结果。

【讨论】:

再次感谢。我还发现llc 默认打开优化 (-02) 而 gcc 和 clang 默认不使用优化 (-O0)(我花了很长时间才弄清楚为什么程序集输出不同)。

以上是关于如何在 Intel 语法中使用 clang 生成汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章

g++ vs intel/clang 参数传递顺序?

如何自托管 Clang?

C++学习(三四八)CLang GCC

如何使用 clang 或其他工具生成数据流图?

objdump 如何发出 intel 语法

如何在 VS2015 中调试 Clang 静态链接库