问题 为什么MSVC不支持AMD64和Itanium目标的内联汇编?


昨天我了解到,在编译AMD64和Itanium目标时,Microsoft Visual C ++不支持内联汇编(使用__asm关键字)。

那是对的吗?如果是这样,有谁知道为什么他们不支持这些目标的内联汇编?这似乎是一个相当大的特点,只是放弃......


6304
2017-08-18 17:46


起源



答案:


正确,它仍然不受支持 VS 2010 Beta 1。我的猜测是内联汇编实现起来太难了:Microsoft实现它的方式,它与周围的C代码集成,以便数据可以流入和流出C代码,并自动注入适当的胶水代码。为此,C编译器实际上需要理解汇编代码;他们只是没有为AMD64和Itanium实现这一点。


10
2017-08-18 17:53



C编译器生成ASM作为中间件,没有什么能让它在AMD64上允许内联ASM变得“困难”。平台规范是支持x86的几个编译器中x86_64目标不存在内联ASM的唯一原因。 - Mark K Cowan
@MarkKCowan:你有没有? 看到 MSVC的内联ASM?它涉及很多我做什么意思;您可以自由地将C / C ++变量与汇编代码文本混合在一起,因此编译器必须解析并(在某种程度上)分析所有代码,而不是像GCC那样以类似于printf的样式指定汇编代码本身的方式格式字符串,输入,输出和修改寄存器的显式描述消除了编译器尝试分析程序集的任何需要。老实说,我更喜欢GCC的方法,因为它涉及较少的二次猜测编译器。 - SamB
@SamB是的,与Delphi中的内联汇编相同。我只是希望GCC不使用AT&T语法:( - Mark K Cowan
@MarkKCowan哦,当然,英特尔组装的AT&T语法是craptastic。而且我对GCC的实际约束语法(尤其是该语法的文档)也不是太疯狂了。但是汇编代码是 持续 我想要猜测编译器会认为某些代码的目的是什么,并且有时候对完整汇编程序的访问有其用途...... - SamB


答案:


正确,它仍然不受支持 VS 2010 Beta 1。我的猜测是内联汇编实现起来太难了:Microsoft实现它的方式,它与周围的C代码集成,以便数据可以流入和流出C代码,并自动注入适当的胶水代码。为此,C编译器实际上需要理解汇编代码;他们只是没有为AMD64和Itanium实现这一点。


10
2017-08-18 17:53



C编译器生成ASM作为中间件,没有什么能让它在AMD64上允许内联ASM变得“困难”。平台规范是支持x86的几个编译器中x86_64目标不存在内联ASM的唯一原因。 - Mark K Cowan
@MarkKCowan:你有没有? 看到 MSVC的内联ASM?它涉及很多我做什么意思;您可以自由地将C / C ++变量与汇编代码文本混合在一起,因此编译器必须解析并(在某种程度上)分析所有代码,而不是像GCC那样以类似于printf的样式指定汇编代码本身的方式格式字符串,输入,输出和修改寄存器的显式描述消除了编译器尝试分析程序集的任何需要。老实说,我更喜欢GCC的方法,因为它涉及较少的二次猜测编译器。 - SamB
@SamB是的,与Delphi中的内联汇编相同。我只是希望GCC不使用AT&T语法:( - Mark K Cowan
@MarkKCowan哦,当然,英特尔组装的AT&T语法是craptastic。而且我对GCC的实际约束语法(尤其是该语法的文档)也不是太疯狂了。但是汇编代码是 持续 我想要猜测编译器会认为某些代码的目的是什么,并且有时候对完整汇编程序的访问有其用途...... - SamB


这似乎是一个相当大的特点,只是放弃......

只要遵循C约定,调用用汇编程序编写的函数就很容易。 本教程 解释如何。


4
2017-08-18 17:59



同意,唯一真正的限制是你不能在同一个例程中混合使用C和ASM。来自Pascal背景,其中内联ASM混合在科学代码中很常见,我完全同意强制将语言分离为不同功能的决定。 - Mark K Cowan