【问题标题】:How to generate assembly code with clang in Intel syntax?如何在 Intel 语法中使用 clang 生成汇编代码?
【发布时间】: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 程序集。介意这样回答吗?
  • 哦,我想这不是问题。

标签: c++ assembly x86 clang 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)(我花了很长时间才弄清楚为什么程序集输出不同)。
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2012-12-22
  • 2011-01-11
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多