Windows下用Visual Studio编译x64平台的内联汇编
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。
这是个以Intel C++ Compiler为后端的VS2010。Intel C++ Compiler本身支持Microsoft-style和GNU-like style的内联汇编(http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/intref_cls/common/intref_data_align_ma_ia_linux_ia.htm ),遗憾的是Windows下不支持那么多(因为Linux下汇编代码是交给GNU assembler处理的,而Windows下是由内嵌assembler处理的),但至少可以让我们用到熟悉的内联汇编:
__asm {
...
}
有一种比较特殊的汇编用法是用byte直接写指令,这种用法在一些情况下是不可代替的。上面前两种方法中,可以用和Linux上通用的DB directive完成。第三种中可以和Visual Studio x86-32编译时一样用emit完成(http://msdn.microsoft.com/en-us/library/1b80826t(v=vs.80).aspx)。
摘自 金卓军的博客
补充:综合编程 , 其他综合 ,