VS2012在win32平台编译的时候能够很好的支持汇编语言的嵌入。创建一个控制台应用程序,选择空项目。项目创建好以后添加一个.cpp文件。在cpp文件中写入以下代码:php
[cpp] view plain copy print?html
#include <iostream> using namespace std; int Add(int num1, int num2) { __asm { mov eax,num1 mov ecx,num2 add eax,ecx } } void main() { int a = Add(2,3); cout<< a <<endl; system("pause"); }
能够发现上述代码能够正常使用,而后将工程项目切换至x64编译模式下,就会发现有以下的错误提示:mysql
error C4235: 使用了非标准扩展: 不支持在此结构上使用“__asm”关键字ios
也就是说在x64编译模式下不支持__asm的汇编嵌入。从网上的资料上查到虽然不能直接嵌入汇编程序段,可是能够将程序段所有放到一个asm文件下进行编译,最后asm文件编译生成的obj文件和.cpp文件编译生成的obj文件连接到一块儿就能够生成exe文件了。sql
新建一个asm文件,这里创建了文件名为test.asm的文件。数据库
写入以下测试代码:编程
[cpp] view plain copy print?函数
.CODE Int_3 PROC MOV EAX, 1234 ;返回1234 RET Int_3 ENDP MY_TEST PROC MOV EAX, 23 ;返回23 RET MY_TEST ENDP END
上述代码段中一个两个汇编函数Int_3和MY_TEST。工具
而后新建一个.h文件来对汇编程序中的代码做声明。这里创建一个名为test.h的头文件。写入以下声明信息:测试
[cpp] view plain copy print?
#ifndef __ASMCODE_H #define __ASMCODE_H extern "C" { int _stdcall Int_3(); int _stdcall MY_TEST(); } #endif
在main.cpp中包含上述头文件,调用汇编中的函数,在x64模式下编译,这时会发现仍是有错误。下面步骤是关键!!
鼠标右键test.asm文件。
进入属性—>配置属性—>常规,设置从生成中排除为否,选择项类型为自定义生成工具,依次点击应用,肯定。
这时候就会发现多了一项自定义生成工具。
在自定义生成工具下选择常规设置红框中的三项:
Command Line(命令行): ml64 /c %(fileName).asm Outputs(输出): %(fileName).obj;%(Outputs) //注意:这时入口不能设置为main,而是空缺,vc会自动找到c中的main从vcrt进入到main中。 //若是是纯汇编,能够将入口设置为main,用汇编来写main
设置完成后应用,肯定,而后从新编译程序,发现这个时候就能够编译成功了。
点击调试。可能会出现错误:
没法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件
这是由于在连接生成的过程当中都没有生成pdb调试文件,这时要修改项目属性,完成如下三项就能够了。
首先打开菜单 项目->项目属性页
一、选择 配置属性->连接器->调试->生成调试信息 改成 是
二、选择 配置属性->C/C++ ->常规->调试信息格式 改成 用于“编辑并继续”的程序数据库(/ZI)
三、选择 配置属性->C/C++ ->优化->优化 改成 禁用(/Od)
这是就能够正常的在VS2012 x64模式下使用汇编程序了,根据网上资料,X64下汇编指令和32位汇编指令会有些许不一样,深刻使用的时候还须要去查询X64下汇编手册。
参考资料:
http://bbs.pediy.com/showthread.PHP?p=1318183 在VS2012 x64下编译驱动使用asm关键字的完整方案
http://www.cnblogs.com/cryinstall/archive/2011/04/24/2280843.html VS2008中编译经过,但调试时出现“未使用调试信息生成二进制文件”的问题
http://blog.sina.com.cn/s/blog_6b849dd00100xcgj.html x86平台转x64平台关于内联汇编再也不支持的解决
注意汇编文件名不能与cpp文件名重复
jpg改rar