如何在 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 生成汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章