VS2012在win32平台编译的时候可以很好的支持汇编语言的嵌入。建立一个控制台应用程序,选择空项目。项目建立好之后添加一个.cpp文件。在cpp文件中写入如下代码:

  1. #include <iostream>
  2. using namespace std;
  3. int  Add(int num1, int num2)
  4. {
  5. __asm
  6. {
  7. mov eax,num1
  8. mov ecx,num2
  9. add eax,ecx
  10. }
  11. }
  12. void main()
  13. {
  14. int a = Add(2,3);
  15. cout<< a <<endl;
  16. system("pause");
  17. }
#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编译模式下,就会发现有如下的错误提示:

error C4235: 使用了非标准扩展: 不支持在此结构上使用“__asm”关键字

也就是说在x64编译模式下不支持__asm的汇编嵌入。从网上的资料上查到虽然不能直接嵌入汇编程序段,但是可以将程序段全部放到一个asm文件下进行编译,最后asm文件编译生成的obj文件和.cpp文件编译生成的obj文件链接到一起就可以生成exe文件了。

新建一个asm文件,这里建立了文件名为test.asm的文件。

写入如下测试代码:

  1. .CODE
  2. Int_3 PROC
  3. MOV EAX, 1234  ;返回1234
  4. RET
  5. Int_3 ENDP
  6. MY_TEST PROC
  7. MOV EAX, 23 ;返回23
  8. RET
  9. MY_TEST ENDP
  10. END
.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的头文件。写入如下声明信息:

  1. #ifndef __ASMCODE_H
  2. #define __ASMCODE_H
  3. extern "C"
  4. {
  5. int _stdcall Int_3();
  6. int _stdcall MY_TEST();
  7. }
  8. #endif
#ifndef __ASMCODE_H
#define __ASMCODE_H extern "C"
{
int _stdcall Int_3();
int _stdcall MY_TEST();
} #endif

在main.cpp中包含上述头文件,调用汇编中的函数,在x64模式下编译,这时会发现还是有错误。下面步骤是关键!!

鼠标右键test.asm文件。

进入属性—>配置属性—>常规,设置从生成中排除为否,选择项类型为自定义生成工具依次点击应用,确定

这时候就会发现多了一项自定义生成工具。

在自定义生成工具下选择常规设置红框中的三项:

设置完成后应用,确定,然后重新编译程序,发现这个时候就可以编译成功了。

点击调试。可能会出现错误:

无法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件

这是因为在链接生成的过程中都没有生成pdb调试文件,这时要修改项目属性,完成以下三项就可以了。

首先打开菜单 项目->项目属性页 
1、选择 配置属性->链接器->调试->生成调试信息 改为 是 
2、选择 配置属性->C/C++ ->常规->调试信息格式 改为 用于“编辑并继续”的程序数据库(/ZI) 
3、选择 配置属性->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

VS2012下X64平台嵌入汇编程序的更多相关文章

  1. x86平台转x64平台关于内联汇编不再支持的解决

    x86平台转x64平台关于内联汇编不再支持的解决     2011/08/25   把自己碰到的问题以及解决方法给记录下来,留着备用!   工具:VS2005  编译器:cl.exe(X86 C/C+ ...

  2. Windows7+VS2012下OpenGL 4的环境配置

    系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...

  3. 线下AWD平台搭建以及一些相关问题解决

    线下AWD平台搭建以及一些相关问题解决 一.前言 文章首发于tools,因为发现了一些新问题但是没法改,所以在博客进行补充. 因为很多人可能没有机会参加线下的AWD比赛,导致缺乏这方面经验,比如我参加 ...

  4. BarTender如何将条码下的数字嵌入到条码中

    现今社会,在各种包装箱子.书籍.超市商品等东西上面,必不可少的绝对要数条形码或者二维码了.有时候,根据客户的需求或者其他条件限制等原因,我们需要将BarTender 2016条码下的数字嵌入到条码中. ...

  5. VS2012下安装NuGet

    关于NuGet的两篇文章:MSDN上的使用 NuGet 管理项目库,和博客园dudu的程序员,用NuGet管理好你的包包. VS2012下安装NuGet 在工具菜单下选择“扩展和更新”. 选择“联机” ...

  6. 最新版Duilib在VS2012下编译错误的解决方法

            svn了好几次最新版本的项目源代码, 在VS2012下编译老是出错, 改了后没记录, 结果又忘记, 所以在此记录下.        这个问题很普遍, 非常多的人遇到.       至于 ...

  7. VS2012下使用Moq进行单元测试

    单元测试虽然是个很老的东西了,但平时写代码一般都不写测试,因为VS调试完全可以满足了,所以一直也就没有用过,刚好在<Pro.ASP.NET.MVC.3.Framework>中看到了Moq这 ...

  8. VS2012下基于Glut 矩阵变换示例程序2:

    在VS2012下基于Glut 矩阵变换示例程序:中我们在绘制甜圈或者圆柱时使用矩阵对相应的坐标进行变换后自己绘制甜圈或者圆柱.我们也可以使用glLoadMatrixf.glLoadMatrixd载入变 ...

  9. 基于OpenCV做“三维重建”(0)-- OpenCV3.2+VIZ6.3.0在vs2012下的编译和使用

    一.问题提出         ViZ对于显示3维的效果图来说,非常有帮助:我在使用OpenCV进行双目测距的过程中,有一些参数希望能够通过可视化的方法显示出来,所以参考了这方面相关的资料.做了一些实验 ...

随机推荐

  1. 初步搭建RocketMQ环境

    1. 去官网https://github.com/alibaba/RocketMQ/releases下载alibaba-rocketmq-3.2.6.tar.gz,这个是已经maven install ...

  2. ubuntu16.04装MatConvNet

    按matconvnet官网上的步骤来,编译代码的时候会发现编译失败. 参考这条issues 以下是我的解决方案: I use ubuntu16.04 with x64 architecture. I ...

  3. sql 知识点系统汇总

    提供性能: .服务器往往具有强大的计算能力和速度..避免把大量的数据下载到客户端,减少网络上的传输量. 第一章 T-SQL 语句 1.1数据类型 文本型 -- CHAR 定长型 <=8000字节 ...

  4. JS操作cookies方法

    /** * 写入cookies */function setCookie(name, value) { var time = "1d"; //默认一天失效 var strsec = ...

  5. PHP Ajax 跨域问题最佳解决方案

    本文通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com. 如果直接使用 ...

  6. 20145204&20145212实验二报告

    实验二固件设计 步骤: 1.开发环境的配置,参考实验一 1.将实验代码拷贝到共享文件夹中. 2.在虚拟机中编译代码.对于多线程相关的代码,编译时需要加-lpthread的库.下载调试在超级终端中运行可 ...

  7. C# 读取excel日期时获取到数字转换成日期

    string strDate= DateTime.FromOADate(Convert.ToInt32(data[i][7])).ToString("d"); strDate= D ...

  8. LInux升级Python版本2.7.11所遇问题汇总

    首先请原谅我使用校园网络,基本上打不开谷歌,网络搜取得帮助均来自度娘. 对于我这个linux新手 IT 新手来说,自己升级点东西好担心,万一出错,可能都要重来.... 参照度娘内容和自己摸索,今天晚上 ...

  9. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  10. 什么叫哈希表(Hash Table)

    散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. - 数据结构 ...