Windows下用Visual Studio编译x64平台的内联汇编

原文地址:http://blog.csdn.net/ariesjzj/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。

这是个以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 ),遗憾的是Linux和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)。

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值