从icc获取Intel-syntax asm输出,而不是默认的AT&T语法?

我遇到了问题。 我一直在使用gcc来编译/汇编我的C代码一段时间,并习惯于阅读英特尔汇编语法。 我在生成程序集文件时使用了-masm=intel标志。

然而最近,由于公司迁移,他们获得了英特尔的icc,声称它更好。 所以现在我需要使用icc,但奇怪的是它有默认的汇编语法为AT&T。 我试图改变它,但它没有用,所以我联系了英特尔支持,他们也不知道,每个人都给了我一个矛盾的答案。

有没有办法集成gcc和icc,以便我使用icc编译“优势”,同时用gcc编译intel的语法?

我正在使用ubuntu并获得了icc版本12.x.

这面旗帜?

  -use_msasm Support Microsoft style assembly language insertion using MASM style syntax and, if requested, output assem- bly in MASM format 

https://web.archive.org/web/20120728043315/http://amath.colorado.edu/computing/software/man/icc.html

似乎-masm=intel就像Clang和GCC一样在ICC中运行 ,至少在Compiler Explorer (13.0.1)的当前最新版本中是这样。 我尝试在数组示例上加载总和 ,然后生成下面的程序集

 testFunction(int*, int): xor eax, eax #2.11 test esi, esi #3.23 jle ..B1.18 # Prob 50% #3.23 movsxd rdx, esi #3.3 ... 

而在Steve-o的答案中指定-use_msasm根本不起作用

英特尔的官方手册页说它是-use-msasm而不是-use_msasm但这也不起作用

-use-msasm (仅限i32,i32em)

  • 支持使用MASM样式语法插入Microsoft *样式汇编语言,如果需要,还支持MASM格式的输出程序集。

  • 注意:GNU内联汇编程序(asm)代码和Microsoft内联汇编程序(msasm)代码不能在同一个翻译单元中一起使用。

然而,那是2006年的ICC 9.x,这是很久以前的选择,而且该选项可能在9.x和13.x之间的某个地方发生了变化。

我进一步挖掘并意识到至少从ICC 16.0开始,该选项仅适用于源代码中的汇编块而不是用于输出Intel语法

使用-msasm

允许在C或C ++文件中使用汇编代码的块和整个函数。

描述

此选项允许在C或C ++文件中使用汇编代码的块和整个函数。

它允许Microsoft * MASM样式的内联汇编块而不是GNU *样式的内联汇编块。

替代选项

-fasm-blocks

正如您所看到的,它只是-fasm-blocks的别名。 此外, -use-asm选项已被弃用,尽管我不知道-use-msasm的命运

参考

  • 适用于Linux *的英特尔®C++编译器 – 9.x手册
  • 英特尔®C++编译器16.0用户和参考指南
  • 英特尔®C++编译器17.0开发人员指南和参考