使VS支持x64内联汇编
转载:https://blog.csdn.net/jinzhuojun/article/details/7085138
截至目前(2018年底2019年初),本人windows平台下的各种开发所用的IDE主要就是VS2015。虽然VS2017已经出来一年多了,本人也自己使用过一段时间,但没发现特别大的亮点,又考虑到整个研发团队都在用VS2015,所以也一直是vs2015到现在。
最近在做一个大型矩阵运算相关的研究时,想试着自己结合汇编做点优化实验,当然考虑到实际程序情况,最适合的使用汇编的方式就是内联汇编。Windows下使用内联汇编方法很简单。使用 __asm 关键词结构作为制导就可以。
__asm{
// Assembly Codes here
}
但是,Visual Studio目前只支持32位(x86)的内联汇编,而不支持64位(x64)下的内联汇编。所以如果使用VS2015,且在x64下编译的话,会报错 “使用了非标准扩展: 不支持在此结构上使用“__asm”关键字”。
经过本人测试,最好的解决方法就是64位时切换到intel的编译器进行研发。自动安装配置好intel parallel studio XE 后,还可以根据需要自由切换选择使用哪款编译器来Compile你的Code,挺好~
intel的很多开发套件都是只能免费试用一个月,为了省钱的(也就是比较穷)我们只能搜索对应的license文件以期进行长期的免费使用了。
我自己搜索的,是Intel Parallel Studio XE 2016 Cluster Version,自己用的这款,刚好最高支持到VS2015,全部安装好后,对应的操作也很方便(资源共享,内含安装文件和license:链接:https://pan.baidu.com/s/14vDCooJYbROXcxTvZUi2Cw
提取码:uf17 )。
需要用intel C++ Compiler的时候,右键工程->属性->(属性页->配置属性)->常规->平台工具集,修改平台工具集为intel C++ Compiler 即可。如下图:
或者更省事儿点,同样右键工程,右键菜单找到Intel Compiler,就可以来回自由切换Intel Compiler和Visual C++ Compiler了。如下两图:
剩下的大家伙就可以开始折腾了。
附注(引用),部分参考了链接:https://blog.csdn.net/jinzhuojun/article/details/7085138 , 特此鸣谢。
Linux下,GCC支持x86-32/64的内联汇编。Windows下,Visual Stdio支持x86-32的内联汇编,但不支持x64的内联汇编(至少到Visual Studio 2010是这样),而是提供了一些Intrinsics(一种类似于内联函数的东西)。MSDN给出了这些intrinsics的列表:http://msdn.microsoft.com/en-us/library/26td21ds.aspx。
这些intrinsics可以让我们使用cpuid和rdstc这类底层特性,但终归有限的intrinsics是无法满足人民日益增长的开发需要的,于是我们需要能更方便写汇编代码的方法。这里讨论三种方法:
* 第一种是比较生猛的做法,直接把全部程序写成.S汇编文件,适合各类牛人及猛男,不多讨论。(Visual Studio相关配置例子见http://www.deconflations.com/2011/masm-assembly-in-visual-studio-2010/)
* 第二种比较柔和些,把需要写成汇编的函数写到.S汇编文件里,最后链接进来。(http://www.lomont.org/Math/Papers/2009/Introduction%20to%20x64%20Assembly.pdf里有一个简单例子)
* 重点讨论第三种,首先安装Intel C++ Compiler XE,然后打开Parallel Studio XE 2011 with VS2010。