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

77

正如这个问题所示,使用g++,可以执行g++ -S -masm=intel test.cpp来获得汇编代码。 同样地,使用clang,可以执行clang++ -S test.cpp,但是clang不支持-masm=intel选项(warning argument unused during compilation: -masm=intel)。那么,如何在clang中使用intel语法?


@JerryCoffin:谢谢,我使用clang生成了一个.bc文件,然后成功地用llc输出了英特尔汇编。您能把这个作为答案吗? - Jesse Good
哦,我想那不是问题。 - Jerry Coffin
3个回答

129
如下所示由@thakis在下面注释,较新版本的Clang(3.5+)接受-masm=intel参数。
对于旧版本,这应该让clang使用Intel语法发出汇编代码:
clang++ -S -mllvm --x86-asm-syntax=intel test.cpp

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

@dcoles 对于clang 3.7无效。我执行了$clang -S -mllvm --x86-asm-syntax=intel file.c。这里有什么问题吗?它没有给出任何错误并且默默退出。 - S S
1
@saumya-suhagiya 我刚刚确认这个命令在clang 3.8.0-svn244195-1~exp1上仍然有效。上面显示的命令将生成一个名为test.s的文件。您可以使用-o <path>选项将此输出位置更改为自定义位置。 - dcoles
1
@dcoles 你好,也许这不是一个很聪明的问题。使用nasm汇编代码并进行编译和链接是否可行? - Alexander Cska
1
@AlexanderCska 我不确定在没有手动修复的情况下是否可能。虽然NASM的语法类似于英特尔,但它们之间存在一些不兼容性。 - dcoles

51

从clang r208683版本(clang 3.5+)开始,它可以理解-masm=intel指令。所以如果你使用的clang版本足够新,就可以直接使用该指令。


我觉得使用“-masm=intel”生成的代码无法再次通过“clang”进行编译?我正在运行clang 3.8版本。 - Yai0Phah

17

假设你可以让Clang生成普通的LLVM字节码,然后使用llc编译成汇编语言,再使用其 --x86-asm-syntax=intel选项以获取Intel语法的结果。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接