VS2012下X64平台嵌入汇编程序
VS2012在win32平台编译的时候可以很好的支持汇编语言的嵌入。建立一个控制台应用程序,选择空项目。项目建立好之后添加一个.cpp文件。在cpp文件中写入如下代码:
- #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");
- }

#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的文件。
写入如下测试代码:
- .CODE
- Int_3 PROC
- MOV EAX, 1234 ;返回1234
- RET
- Int_3 ENDP
- MY_TEST PROC
- MOV EAX, 23 ;返回23
- RET
- MY_TEST ENDP
- 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的头文件。写入如下声明信息:
- #ifndef __ASMCODE_H
- #define __ASMCODE_H
- extern "C"
- {
- int _stdcall Int_3();
- int _stdcall MY_TEST();
- }
- #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平台嵌入汇编程序的更多相关文章
- x86平台转x64平台关于内联汇编不再支持的解决
x86平台转x64平台关于内联汇编不再支持的解决 2011/08/25 把自己碰到的问题以及解决方法给记录下来,留着备用! 工具:VS2005 编译器:cl.exe(X86 C/C+ ...
- Windows7+VS2012下OpenGL 4的环境配置
系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...
- 线下AWD平台搭建以及一些相关问题解决
线下AWD平台搭建以及一些相关问题解决 一.前言 文章首发于tools,因为发现了一些新问题但是没法改,所以在博客进行补充. 因为很多人可能没有机会参加线下的AWD比赛,导致缺乏这方面经验,比如我参加 ...
- BarTender如何将条码下的数字嵌入到条码中
现今社会,在各种包装箱子.书籍.超市商品等东西上面,必不可少的绝对要数条形码或者二维码了.有时候,根据客户的需求或者其他条件限制等原因,我们需要将BarTender 2016条码下的数字嵌入到条码中. ...
- VS2012下安装NuGet
关于NuGet的两篇文章:MSDN上的使用 NuGet 管理项目库,和博客园dudu的程序员,用NuGet管理好你的包包. VS2012下安装NuGet 在工具菜单下选择“扩展和更新”. 选择“联机” ...
- 最新版Duilib在VS2012下编译错误的解决方法
svn了好几次最新版本的项目源代码, 在VS2012下编译老是出错, 改了后没记录, 结果又忘记, 所以在此记录下. 这个问题很普遍, 非常多的人遇到. 至于 ...
- VS2012下使用Moq进行单元测试
单元测试虽然是个很老的东西了,但平时写代码一般都不写测试,因为VS调试完全可以满足了,所以一直也就没有用过,刚好在<Pro.ASP.NET.MVC.3.Framework>中看到了Moq这 ...
- VS2012下基于Glut 矩阵变换示例程序2:
在VS2012下基于Glut 矩阵变换示例程序:中我们在绘制甜圈或者圆柱时使用矩阵对相应的坐标进行变换后自己绘制甜圈或者圆柱.我们也可以使用glLoadMatrixf.glLoadMatrixd载入变 ...
- 基于OpenCV做“三维重建”(0)-- OpenCV3.2+VIZ6.3.0在vs2012下的编译和使用
一.问题提出 ViZ对于显示3维的效果图来说,非常有帮助:我在使用OpenCV进行双目测距的过程中,有一些参数希望能够通过可视化的方法显示出来,所以参考了这方面相关的资料.做了一些实验 ...
随机推荐
- 【原】fiddler修改线上的内容
摘要:当我们线上的代码出bug了,咋办呢?有时候本地的代码跟线上的代码还是运行环境还是有区别的.比如有些封装的方法需要运动到手机上可以调试,而浏览器是无法调试的.如果不想每次修改完再放上到测试环境看效 ...
- js 获取据当前时间n天前的时间
<script type="text/javascript"> function getLastDate() { var date = new Date(); ; va ...
- elasticsearch curl operation
Elastic Search API Index.简单的介绍了使用Elastic Search 如何建立索引. ElasticSearch-API-Index 索引创建API允许初始化一个索引.Ela ...
- Web jquery表格组件 JQGrid 的使用 - 5.Pager翻页、搜索、格式化、自定义按钮
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
- html5 新选择器 querySelector querySelectorAll
querySelector 返回满足条件的单个元素 使用实例 HTML <div id="main">主体布局</div> JS var main =doc ...
- win7提示“User Profile Service服务未能登录”
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 最近,有个同事打电话告诉我说他的用户名无法登陆到系统,提示“User Profile Service服务未能登录,无法加载用户配置文 ...
- tyvj1034 尼克的任务
描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成.尼克的一个工作日为N分钟,从第一分钟开始到第N ...
- ZOJ 3696 Alien's Organ
泊松分布.... Alien's Organ Time Limit: 2 Seconds Memory Limit: 65536 KB There's an alien whose name ...
- 【相当实用】如何让TortoiseSVN导出新增或修改过的文件
当一个网站项目进入运营维护阶段以后,不会再频繁地更新全部源文件到服务器,这个时间的修改大多是局部的,因此更新文件只需更新修改过的文件,其他没有修改过的文件就没有必要上载到服务器.但一个稍微上规模的网站 ...
- 利用 autoconf 和 automake 生成 Makefile 文件
一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...